OSDN Git Service

Version 0.6.149, fix X.Audio & X.UI.
[pettanr/clientJs.git] / 0.6.x / js / 01_core / 11_XClass.js
index be37dc2..cbaeb22 100644 (file)
@@ -20,11 +20,8 @@ var
 \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
@@ -48,26 +45,18 @@ X_Class_CommonMethods =
                        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
@@ -90,20 +79,6 @@ X_Class_CommonMethods =
                        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
@@ -234,9 +209,7 @@ var X_Class = {
        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
@@ -250,7 +223,7 @@ var X_Class = {
  * </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
@@ -259,7 +232,7 @@ var X_Class = {
  * @namespace X.Class\r
  * @alias X.Class\r
  */ \r
-X[ 'Class' ] = {\r
+X[ 'Class' ] = /** @lends X.Class */ {\r
 \r
     /**\r
      * 設定なし。\r
@@ -286,32 +259,14 @@ X[ 'Class' ] = {
        '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
@@ -321,19 +276,34 @@ X[ 'Class' ] = {
 // ------------------------------------------------------------------------- //\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
@@ -349,7 +319,6 @@ X[ 'Class' ] = {
                        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
@@ -359,20 +328,6 @@ X[ 'Class' ] = {
                        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
@@ -411,25 +366,17 @@ X[ 'Class' ] = {
                } 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
@@ -443,15 +390,7 @@ function X_Class_getClass( instance ){
                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
@@ -459,43 +398,7 @@ function X_Class_getClassDef( KlassOrInstance ){
        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
@@ -582,16 +485,12 @@ function X_Class_inherits( /* displayName, classSetting, opt_PrivateClass, props
                // クラス設定がない場合、親からコピーして、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
@@ -628,14 +527,11 @@ function X_Class_actualConstructor( f, args ){
                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
@@ -643,21 +539,14 @@ function X_Class_actualConstructor( f, args ){
                                        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