\r
X_Class_CLASS_LIST = [],\r
X_Class_DEF_LIST = [],\r
- X_Class_PRIVATE_CLASS_LIST = [],\r
- X_Class_PRIVATE_DEF_LIST = [],\r
X_Class_CALLING_SUPER = [],\r
X_Class_CALL_SUPER_STACK = [],\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_UA[ 'OperaMobile' ] && !X_UA[ 'OperaTablet' ] && !!X_emptyFunction.prototype.__proto__,\r
klass = X_Class_getClass( instance ),\r
def = X_Class_getClassDef( klass ),\r
data, p, i;\r
- if( def.isPrivate && !X_Class_killPrivateFlag && ( !this[ '_listeners' ] || !this[ '_listeners' ][ X_Listeners_.KILL_RESERVED ] ) ){\r
- X.Logger.critical( 'PrivateInstance.kill() work in PrivateUser.kill().' );\r
- return;\r
- };\r
- X_Class_killPrivateFlag = false; // instance.kill() 内で PrivateInstance.kill() を防ぐため\r
\r
// TODO kill 中の kill の呼び出しを防ぐ, 破棄済のインスタンスへの kill\r
\r
if( this[ 'instanceOf' ]( X_EventDispatcher ) ){\r
- if( !def.isPrivate ){\r
- if( this[ 'dispatch' ]( X_EVENT_BEFORE_KILL_INSTANCE ) & X_Callback_PREVENT_DEFAULT ){\r
- this[ 'dispatch' ]( X_EVENT_KILL_INSTANCE_CANCELED );\r
- return;\r
- };\r
- if( this[ '_listeners' ] && this[ '_listeners' ][ X_Listeners_.DISPATCHING ] ){\r
- this[ '_listeners' ][ X_Listeners_.KILL_RESERVED ] = true;\r
- return;\r
- };\r
- } else {\r
- this[ 'dispatch' ]( X_EVENT_BEFORE_KILL_INSTANCE ); \r
+\r
+ if( this[ 'dispatch' ]( X_EVENT_BEFORE_KILL_INSTANCE ) & X_Callback_PREVENT_DEFAULT ){\r
+ this[ 'dispatch' ]( X_EVENT_KILL_INSTANCE_CANCELED );\r
+ return;\r
+ };\r
+ if( this[ '_listeners' ] && this[ '_listeners' ][ X_LISTENERS_DISPATCHING ] ){\r
+ this[ '_listeners' ][ X_LISTENERS_KILL_RESERVED ] = true;\r
+ return;\r
};\r
\r
// asyncDispatch の削除\r
def.live && def.live.splice( def.live.indexOf( instance ), 1 );\r
def.pool[ def.pool.length ] = instance;\r
};\r
- if( def.privateClass ){\r
- i = def.userList.indexOf( instance );\r
- if( i !== -1 ){\r
- data = X_Class_getPrivate( instance );\r
- if( data[ '_listeners' ] && data[ '_listeners' ][ X_Listeners_.DISPATCHING ] && data[ 'instanceOf' ]( X.EventDispatcher ) ){\r
- data[ '_listeners' ][ X_Listeners_.KILL_RESERVED ] = true;\r
- } else {\r
- X_Class_killPrivateFlag = true;\r
- data[ 'kill' ]();\r
- };\r
- def.dataList.splice( i, 1 );\r
- def.userList.splice( i, 1 );\r
- };\r
- };\r
},\r
\r
/**\r
POOL_OBJECT : 1,\r
ABSTRACT : 2,\r
FINAL : 4,\r
- SUPER_ACCESS : 8,\r
- PRIVATE_DATA : 16,\r
- SINGLETON : 32\r
+ SINGLETON : 8\r
};\r
\r
/**\r
* </ol>\r
* \r
* <ol>\r
- * <li>X_Class.create( opt_settings, opt_name, opt_privateClass, opt_props ) でクラスを登録.\r
+ * <li>X.Class.create( opt_settings, opt_name, opt_props ) でクラスを登録.\r
* <li>コンストラクタ となるメソッドは、opt_props 内の Constructor : function( arg ){ ... }, に書く.\r
* <li>通常通り new で インスタンス生成\r
* <li>kill() でオブジェクトをクリーンして削除、pool が有効の場合は pool される.\r
* @namespace X.Class\r
* @alias X.Class\r
*/ \r
-X[ 'Class' ] = {\r
+X[ 'Class' ] = /** @lends X.Class */ {\r
\r
/**\r
* 設定なし。\r
'FINAL' : X_Class.FINAL,\r
\r
/**\r
- * 使用を中止。petanR ライブラリ使用プロジェクトから SUPER_ACCESS を消したらここも削除。\r
- * @const\r
- */\r
- 'SUPER_ACCESS' : X_Class.SUPER_ACCESS,\r
-\r
- /**\r
- * 内部コード、主に X.UI フレームワークに対して、フレーム外に露出するインスタンスとペアで動作する、シャドウなインスタンスの使用を宣言する。\r
- * Javascript はインスタンス毎のカプセル化がとてもコスト高。微妙なコスト増で隠蔽されたインスタンスを使う。\r
- * @const\r
- */\r
- 'PRIVATE_DATA' : X_Class.PRIVATE_DATA,\r
-\r
- /**\r
* 未実装。でも目印になるので付けておきましょう。\r
* @const\r
*/\r
'SINGLETON' : X_Class.SINGLETON,\r
\r
- 'create' : X_Class_create,\r
+ 'create' : X_Class_create\r
\r
// TODO collect\r
- \r
- '_newPrivate' : X_Class_newPrivate,\r
- \r
- '_getPrivate' : X_Class_getPrivate\r
- \r
};\r
\r
\r
// ------------------------------------------------------------------------- //\r
/**\r
* クラスを定義する。<br>\r
- * X_Class.create() によるクラス定義は必ずしもコンストラクタを必要としません。クラス定義時にコンストラクタが未設定の場合、スーパークラスがあればそのコンストラクタを使用します。\r
- * @alias X_Class.create\r
+ * X.Class.create() によるクラス定義は必ずしもコンストラクタ('Constructor')を必要としません。クラス定義時にコンストラクタが未設定の場合、スーパークラスがあればそのコンストラクタを使用します。\r
+ * @alias X.Class.create\r
* @param {string} [displayName] クラスの名前\r
* @param {number} [classSetting=0] X_Class.POOL_OBJECT | X_Class.FINAL など\r
- * @param {__ClassBase__=} [privateClass] このクラスとペアで動作するシャドウクラス\r
* @param {object} [props={}] このクラスのメンバと関数。コンストラクタは Constructor と書くこと\r
* @return {__ClassBase__}\r
+ * @example var myClass = X.Class.create(\r
+ * 'myClass',\r
+ * X.Class.FINAL,\r
+ * {\r
+ * name : '',\r
+ * Constructor : function( obj ){\r
+ * this.name = obj.name;\r
+ * },\r
+ * getName : function(){\r
+ * return this.name;\r
+ * },\r
+ * setName : function(v){\r
+ * this.name = v;\r
+ * }\r
+ * }\r
+ * );\r
*/\r
function X_Class_create( /* displayName, classSetting, privateClass, props */ ){\r
var args = X_Object_cloneArray( arguments ),\r
displayName = args[ 0 ],\r
classSetting,\r
- opt_pool, opt_abstract, opt_final, opt_private,\r
+ opt_pool, opt_abstract, opt_final,\r
privateDef,\r
props,\r
klass,\r
opt_pool = !!( classSetting & X_Class.POOL_OBJECT );\r
opt_abstract = !!( classSetting & X_Class.ABSTRACT );\r
opt_final = !!( classSetting & X_Class.FINAL );\r
- opt_private = !!( classSetting & X_Class.PRIVATE_DATA );\r
if( opt_final && opt_abstract ){\r
X.Logger.critical( 'final & Abstract!' );\r
return;\r
classDef.setting = 0;\r
};\r
\r
- // シャドウクラス\r
- if( X_Class_PRIVATE_CLASS_LIST.indexOf( args[ 0 ] ) !== -1 ){\r
- privateDef = X_Class_getClassDef( args[ 0 ] );\r
- if( privateDef.isPrivate !== true ){\r
- X.Logger.critical( 'PrivateClass not found! please, X_Class.create( X_Class.PRIVATE, {...} ).' );\r
- return;\r
- } else\r
- if( privateDef.Abstract === true ){\r
- X.Logger.critical( 'PrivateClass is Abstract!' );\r
- return;\r
- };\r
- classDef.privateClass = args.shift();\r
- };\r
- \r
// インスタンスのメンバー\r
props = args[ 0 ];\r
if( !X_Type_isObject( props ) ){\r
} else\r
if( opt_pool ){\r
classDef.pool = [];\r
- if( opt_private === false ) classDef.live = [];\r
+ classDef.live = [];\r
}; \r
if( opt_final ){\r
classDef.Final = true;\r
} else {\r
klass[ 'inherits' ] = X_Class_inherits;\r
}; \r
- if( opt_private ){\r
- if( classDef.privateClass ){\r
- X.Logger.critical( 'Private Data Class has no PrivateClass!' );\r
- return;\r
- };\r
- classDef.isPrivate = true;\r
- X_Class_PRIVATE_CLASS_LIST.push( klass );\r
- X_Class_PRIVATE_DEF_LIST.push( classDef );\r
- } else {\r
- X_Class_CLASS_LIST.push( klass );\r
- X_Class_DEF_LIST.push( classDef ); \r
- };\r
+ \r
+ X_Class_CLASS_LIST.push( klass );\r
+ X_Class_DEF_LIST.push( classDef ); \r
+\r
return klass;\r
};\r
\r
klass = cList[ --i ];\r
if( instance.constructor === klass ) return klass;\r
};\r
- cList = X_Class_PRIVATE_CLASS_LIST;\r
- i = cList.length;\r
- for( ; i; ){\r
- klass = cList[ --i ];\r
- if( instance.constructor === klass ) return klass;\r
- };\r
- \r
if( cList.indexOf( instance ) !== -1 ) return instance;\r
- if( X_Class_CLASS_LIST.indexOf( instance ) !== -1 ) return instance;\r
};\r
\r
function X_Class_getClassDef( KlassOrInstance ){\r
if( i === -1 ) i = X_Class_CLASS_LIST.indexOf( X_Class_getClass( KlassOrInstance ) );\r
if( i !== -1 ) return X_Class_DEF_LIST[ i ];\r
\r
- i = X_Class_PRIVATE_CLASS_LIST.indexOf( KlassOrInstance );\r
- if( i === -1 ) i = X_Class_PRIVATE_CLASS_LIST.indexOf( X_Class_getClass( KlassOrInstance ) );\r
- if( i !== -1 ) return X_Class_PRIVATE_DEF_LIST[ i ];\r
- \r
if( X_Class_DEF_LIST.indexOf( KlassOrInstance ) !== -1 ) return KlassOrInstance;\r
- if( X_Class_PRIVATE_DEF_LIST.indexOf( KlassOrInstance ) !== -1 ) return KlassOrInstance;\r
-};\r
-\r
-function X_Class_newPrivate( /* instance, args */ ){\r
- var args = X_Object_cloneArray( arguments ),\r
- user = args.shift(),\r
- def = X_Class_getClassDef( user ),\r
- privateClass = def.privateClass,\r
- privateDef = X_Class_getClassDef( privateClass ),\r
- i = -1;\r
- if( def.userList ){\r
- i = def.userList.indexOf( user );\r
- } else {\r
- def.userList = [];\r
- def.dataList = [];\r
- };\r
- if( i !== -1 ){\r
- X.Logger.critical( 'PrivateData already exist!' );\r
- return;\r
- };\r
- if( privateDef._tempUser ){\r
- X.Logger.critical( 'newPrivate を連続呼び出しされたところ破綻' );\r
- return;\r
- };\r
- privateDef._tempUser = user;\r
- return X_Class_actualConstructor( privateClass( X_Closure_COMMAND_BACK ), args );// privateClass.__new( args );\r
-};\r
-\r
-function X_Class_getPrivate( instance ){\r
- var def = X_Class_getClassDef( instance ),\r
- i = def.userList.indexOf( instance );\r
- if( i !== -1 ) return def.dataList[ i ];\r
};\r
\r
/* over のプロパティを target にコピーする.ただし target の プロパティが優先, force で解除 */\r
// クラス設定がない場合、親からコピーして、Abstract flag は落とす??\r
classSetting = superDef.setting;// &= ~X_Class.ABSTRACT;\r
};\r
- if( superDef.isPrivate ) classSetting = classSetting | X_Class.PRIVATE_DATA;\r
\r
params.push( classSetting );\r
\r
// サブクラスのシャドウ\r
if( args[ 0 ] && X_Class_getClass( args[ 0 ] ) ){\r
params.push( args.shift() );\r
- } else\r
- if( superDef.privateClass ){\r
- params.push( superDef.privateClass );\r
};\r
\r
/* props 未定義でも可 */\r
dataUser = def._tempUser,\r
instance, obj,\r
userDef;\r
+\r
if( def.Abstract ){\r
X.Logger.critical( 'AbstractClass!' );\r
return;\r
};\r
- if( def.isPrivate && !dataUser ){\r
- X.Logger.critical( 'use myClass.newPrivate( instance, ...args )!' );\r
- return;\r
- };\r
\r
instance = def.pool && def.pool.length > 0 ?\r
def.pool.pop() :\r
Object.create( klass.prototype ) :\r
new klass( X_Closure_COMMAND_DROP );\r
\r
- if( def.isPrivate ){\r
- userDef = X_Class_getClassDef( dataUser );\r
- userDef.dataList.push( instance );\r
- userDef.userList.push( dataUser );\r
- instance.User = dataUser;\r
- def._tempUser = null;\r
- } else {\r
- def.live && def.live.push( instance );\r
- };\r
+ def.live && def.live.push( instance );\r
\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 ) || X_Type_isFunction( obj ) ){ // Class\r
+\r
+ if( obj !== instance && ( X_Type_isObject( obj ) || X_Type_isFunction( obj ) ) ){ // Class\r
instance[ 'kill' ]();\r
return obj;\r
};\r