* Class を定義し システムの管理下に置く.\r
* 全てのクラスと pool が有効の場合インスタンスへの参照が保持される.\r
* 1. X.Class.create( opt_settings, opt_name, opt_privateClass, opt_props ) でクラスを登録.\r
- * 2. コンストラクタ となるメソッドは、Constructor : function( arg ){ ... }, に書く.\r
+ * 2. コンストラクタ となるメソッドは、opt_props 内の Constructor : function( arg ){ ... }, に書く.\r
* 3. 通常通り new で インスタンス生成\r
* 4. kill() でオブジェクトをクリーンして削除、pool が有効の場合は pool される.\r
* 5. pool が有効の場合、new で pool されたインスタンスが返される.\r
X_Class_killPrivateFlag = false,\r
X_Class_traits = null,\r
X_Class_useObjectCreate = false, // !!Object.create, http://jsperf.com/prototype-vs-object-create-perf\r
- X_Class_use_proto_ = !!X.emptyFunction.prototype.__proto__;\r
+ X_Class_use_proto_ = !!X.emptyFunction.prototype.__proto__,\r
\r
-/* \r
- * X.Class.create で作られたクラスのインスタンスが共通で備えるメソッド \r
- */\r
-var X_Class_CommonProps = {\r
+/** \r
+ * X.Class.create で定義されたクラスのインスタンスが共通で備えるメソッド を格納\r
+ *\r
+ * @class\r
+ */ \r
+X_Class_CommonProps =\r
+\r
+{\r
+ /*\r
+ * インスタンスの破棄。\r
+ */\r
kill : function(){\r
var instance = this,\r
klass = X_Class_getClass( instance ),\r
// ------------------------------------------------------------------------- //\r
// --- interface ----------------------------------------------------------- //\r
// ------------------------------------------------------------------------- //\r
+\r
+/** @namespace */ \r
X.Class = {\r
- \r
+ /**\r
+ * インスタンスは破棄時(this.kill())に回収され、次回の new MyClass() 時に再利用されます。\r
+ * @memberof X.Class */\r
POOL_OBJECT : 1,\r
+ \r
+ /**\r
+ * 定義するクラスは抽象クラスになります。new AbstractClass() とするとエラーになります。\r
+ * @memberof X.Class */\r
ABSTRACT : 2,\r
+ \r
+ \r
+ /** @memberof X.Class */\r
FINAL : 4,\r
+ /** @memberof X.Class */\r
SUPER_ACCESS : 8,\r
+ /** @memberof X.Class */\r
PRIVATE_DATA : 16,\r
- \r
+ /** @memberof X.Class */\r
SINGLETON : 32, // 未実装\r
\r
create : function( /* displayName, classSetting, opt_PrivateClass, props */ ){\r
privateDef,\r
props,\r
klass,\r
- classDef = {};\r
+ classDef = {}, hash;\r
if( X.Type.isString( displayName ) === true ){\r
classDef.displayName = displayName;\r
args.shift();\r
classDef.Constructor = props.Constructor;\r
};\r
\r
- // TODO use X.Function\r
- klass = new Function( 'var a=arguments,f=a.callee;if(f.__new)return f.__new(a)' );\r
- klass.__new = X_Class_actualConstructor;\r
+ klass = X_Callback_actualClosure( hash = { _ : X_Class_actualConstructor } ); // TODO hash = classDef\r
+ hash.c = klass;\r
klass.superClassOf = X_Class_superClassOf;\r
klass.subClassOf = X_Class_subClassOf;\r
\r
};\r
klass.name = displayName;\r
\r
- if( opt_abstract === true ){\r
+ if( opt_abstract ){\r
classDef.Abstract = true;\r
} else\r
- if( opt_pool === true ){\r
+ if( opt_pool ){\r
classDef.pool = [];\r
if( opt_private === false ) classDef.live = [];\r
}; \r
- if( opt_final === true ){\r
+ if( opt_final ){\r
classDef.Final = true;\r
} else {\r
klass.inherits = X_Class_inherits;\r
}; \r
- if( opt_private === true ){\r
+ if( opt_private ){\r
if( classDef.privateClass ){\r
X.Logger.critical( 'Private Data Class has no PrivateClass!' );\r
return;\r
return klass;\r
},\r
\r
- _getClass : X_Class_getClass,\r
- \r
- _getClassDef : X_Class_getClassDef,\r
- \r
_newPrivate : X_Class_newPrivate,\r
\r
- _getPrivate : X_Class_getPrivate,\r
- \r
- _override : X_Class_override\r
+ _getPrivate : X_Class_getPrivate\r
\r
};\r
\r
return;\r
};\r
privateDef._tempUser = user;\r
- return privateClass.__new( args );\r
+ return X_Class_actualConstructor( privateClass( X_Closure_COMMAND_BACK ), args );// privateClass.__new( args );\r
};\r
\r
function X_Class_getPrivate( instance ){\r
if( X_Class_use_proto_ ){\r
X_Class_traits = Super.prototype;\r
} else {\r
- Super.__new = null;\r
- X_Class_traits = new Super();\r
- Super.__new = X_Class_actualConstructor; \r
+ //Super.__new = null;\r
+ X_Class_traits = new Super( X_Closure_COMMAND_DROP );\r
+ //Super.__new = X_Class_actualConstructor; \r
};\r
klass = X.Class.create.apply( X.Class, params );\r
X_Class_traits = null;\r
* new の実体.コンストラクタの機能は instance.Constructor に書く.\r
* これにより pool された オブジェクト(破棄されたインスタンス) を再利用できる\r
*/\r
-function X_Class_actualConstructor( args ){\r
- var klass = this,\r
+function X_Class_actualConstructor( obj, args ){\r
+ var klass = obj.c,//this,\r
def = X_Class_getClassDef( klass ),\r
dataUser = def._tempUser,\r
instance, obj,\r
X.Logger.critical( 'use myClass.newPrivate( instance, ...args )!' );\r
return;\r
};\r
- klass.__new = null;\r
+ //klass.__new = null;\r
instance = def.pool && def.pool.length > 0 ?\r
def.pool.pop() :\r
X_Class_useObjectCreate ?\r
Object.create( klass.prototype ) :\r
- new klass();\r
- klass.__new = X_Class_actualConstructor;\r
+ new klass( X_Closure_COMMAND_DROP );\r
+ //klass.__new = X_Class_actualConstructor;\r
\r
if( def.isPrivate ){\r
userDef = X_Class_getClassDef( dataUser );\r