CONSTRUCTOR = 'Constructor',\r
killPrivateFlag = false,\r
traits = null,\r
+ useObjectCreate = false, // !!Object.create, http://jsperf.com/prototype-vs-object-create-perf\r
use__proto__ = !!X.emptyFunction.prototype.__proto__;\r
- \r
+ _DEF_LIST = DEF_LIST;\r
/* サブクラスを作るメソッド \r
* var subClass = superClass.inherits( ... ) \r
* http://d.hatena.ne.jp/m-hiyama/20051018/1129605002\r
if( X.Type.isNumber( classSetting ) ){\r
args.shift();\r
} else {\r
- classSetting = superDef.setting;\r
+ // クラス設定がない場合、親からコピーして、Abstract flag は落とす??\r
+ classSetting = superDef.setting;// &= ~X.Class.ABSTRACT;\r
};\r
if( superDef.isPrivate ) classSetting = classSetting | X.Class.PRIVATE_DATA;\r
opt_super = !!( classSetting & X.Class.SUPER_ACCESS );\r
params.push( args[ 0 ] ); /* props サブクラスでは未定義でも可 */\r
\r
// 継承クラスの作成\r
+ if( useObjectCreate ){\r
+ traits = Object.create( Super.prototype );\r
+ } else\r
if( use__proto__ ){\r
traits = Super.prototype;\r
} else {\r
return klass;\r
};\r
\r
- /* X.Class.create で作られたクラスのインスタンスが共通で備えるメソッド */\r
+ /* X.Class.create で作られたクラスのインスタンスが共通で備えるメソッド \r
+ *\r
+ *\r
+ */\r
var CommonProps = {\r
kill : function(){\r
var instance = this,\r
killPrivateFlag = false; // onKill 内で PrivateInstance.kill() を防ぐため\r
// onKill() === false の場合、kill のキャンセル\r
// private は false での キャンセル は無視される\r
+ // TODO kill instance event\r
if( X.Type.isFunction( instance.onKill ) && instance.onKill() === false && !def.isPrivate ){\r
return;\r
};\r
};\r
};\r
},\r
+ \r
+ // Super\r
+ // SuperCall\r
+ \r
instanceOf : function( klass ){\r
var Super = this;\r
if( this.constructor === klass ) return true;\r
var klass = this,\r
def = X.Class._getClassDef( klass ),\r
dataUser = def._tempUser,\r
- instance,\r
+ instance, obj,\r
userDef;\r
if( def.Abstract === true ){\r
X.Notification.critical( 'AbstractClass!' );\r
return;\r
};\r
klass.__new = null;\r
- instance = def.pool && def.pool.length > 0 ? def.pool.pop() : new klass();\r
+ instance = def.pool && def.pool.length > 0 ?\r
+ def.pool.pop() :\r
+ useObjectCreate ?\r
+ Object.create( klass.prototype ) :\r
+ new klass();\r
klass.__new = C;\r
if( def.isPrivate === true ){\r
userDef = X.Class._getClassDef( dataUser );\r
def.live && def.live.push( instance );\r
};\r
if( def.Super ){\r
- // klass.prototype に移動\r
+ // TODO klass.prototype に移動\r
instance.Super = def.SuperProto;\r
instance.SuperConstructor = superConstructor;\r
};\r
- def[ CONSTRUCTOR ] ?\r
- def[ CONSTRUCTOR ].apply( instance, args ) :\r
- def.SuperConstructor &&\r
- def.SuperConstructor.apply( instance, args );\r
+ obj = def[ CONSTRUCTOR ] ?\r
+ def[ CONSTRUCTOR ].apply( instance, args ) :\r
+ def.SuperConstructor &&\r
+ def.SuperConstructor.apply( instance, args );\r
+ if( X.Type.isObject( obj ) && obj !== instance ){\r
+ instance.kill();\r
+ return obj;\r
+ };\r
return instance;\r
};\r
\r
klass.superClassOf = X.Class._superClassOf;\r
klass.subClassOf = X.Class._subClassOf;\r
\r
+ if( useObjectCreate ){\r
+ klass.prototype = X.Class._override( X.Class._override( traits || klass.prototype, props, true ), CommonProps, false );\r
+ klass.prototype.constructor = klass;\r
+ } else\r
if( use__proto__ ){\r
X.Class._override( klass.prototype, props, true );\r
if( traits ){\r