OSDN Git Service

Version 0.6.133, fix for closure compiler - ADVANCED_OPTIMIZATIONS
[pettanr/clientJs.git] / 0.6.x / js / 01_core / 11_XClass.js
index 8fa3773..815e4c1 100644 (file)
@@ -27,7 +27,7 @@ var
        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
+       X_Class_use_proto_         = !X_UA[ 'OperaMobile' ] && !X_UA[ 'OperaTablet' ] && !!X.emptyFunction.prototype.__proto__,\r
                // Opera Mobile 12.10 Android11 IS01 でクラスのメンバが欠落する問題に遭遇。__proto__ を使わないと動作,,,\r
 \r
 X_Class_CommonMethods =\r
@@ -48,7 +48,7 @@ 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 ){\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
@@ -56,8 +56,8 @@ X_Class_CommonMethods =
                \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
+                               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
@@ -65,7 +65,7 @@ X_Class_CommonMethods =
                                        return;\r
                                };\r
                        } else {\r
-                               this.dispatch( X.Event.BEFORE_KILL_INSTANCE );  \r
+                               this.dispatch( X_Event.BEFORE_KILL_INSTANCE );  \r
                        };\r
 \r
                        // asyncDispatch の削除\r
@@ -76,7 +76,7 @@ X_Class_CommonMethods =
                                };\r
                        };\r
                        \r
-                       this.dispatch( X.Event.KILL_INSTANCE );\r
+                       this.dispatch( X_Event.KILL_INSTANCE );\r
                        this._listeners && X_EventDispatcher_systemUnlisten( this );\r
                };\r
                \r
@@ -92,10 +92,10 @@ X_Class_CommonMethods =
                        i = def.userList.indexOf( instance );\r
                        if( i !== -1 ){\r
                                data = X_Class_getPrivate( instance );\r
-                               X_Class_killPrivateFlag = true;\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
@@ -158,7 +158,7 @@ X_Class_CommonMethods =
                var sClass = this,\r
                        args   = arguments,\r
                        name, p, sFunc, hit = false;\r
-               if( X.Type.isFunction( funcNameOrFunc ) ){\r
+               if( X_Type_isFunction( funcNameOrFunc ) ){\r
                        for( p in this.constructor.prototype ){\r
                                if( this.constructor.prototype[ p ] === funcNameOrFunc ){\r
                                        name = p;\r
@@ -180,7 +180,7 @@ X_Class_CommonMethods =
                                hit = true; // 現在の関数にヒット\r
                        } else\r
                        if( hit && X_Object_inObject( name, this ) ){\r
-                               if( X.Type.isFunction( sFunc ) ){\r
+                               if( X_Type_isFunction( sFunc ) ){\r
                                        switch( args.length ){\r
                                                case 1 :\r
                                                        return sFunc.call( this );\r
@@ -224,14 +224,22 @@ X_Class_CommonMethods =
 // ------------------------------------------------------------------------- //\r
 \r
 /**\r
- * Class を定義し システムの管理下に置く.<br>\r
- * 全てのクラスと pool が有効の場合インスタンスへの参照が保持される.\r
+ * <p>Class を定義し システムの管理下に置く。\r
+ * <p>prototype 継承のブラウザ毎の差異も吸収し、 以下から最適な方法をしてくれる。\r
+ * \r
+ * <ol>\r
+ * <li>Object.create はパフォーマンスが悪そうなので現在は使っていない。\r
+ * <li>SubClass.prototype.__proto__ = SuperClass.prototype;\r
+ * <li>SubClass.prototype = new SuperClass;\r
+ * </ol>\r
+ * \r
  * <ol>\r
  * <li>X.Class.create( opt_settings, opt_name, opt_privateClass, opt_props ) でクラスを登録.\r
  * <li>コンストラクタ となるメソッドは、opt_props 内の Constructor : function( arg ){ ... }, に書く.\r
  * <li>通常通り new で インスタンス生成\r
  * <li>kill() でオブジェクトをクリーンして削除、pool が有効の場合は pool される.\r
  * <li>pool が有効の場合、new で pool されたインスタンスが返される.\r
+ * </ol>\r
  * @namespace X.Class\r
  * @alias X.Class\r
  */ \r
@@ -291,14 +299,14 @@ X.Class = {
                        props,\r
                        klass,\r
                        classDef = {}, hash;\r
-               if( X.Type.isString( displayName ) === true ){\r
+               if( X_Type_isString( displayName ) === true ){\r
                        classDef.displayName = displayName;\r
                        args.shift();\r
                };\r
                \r
                // クラス設定\r
                classDef.setting = classSetting = args[ 0 ];\r
-               if( X.Type.isNumber( classSetting ) ){\r
+               if( X_Type_isNumber( classSetting ) ){\r
                        opt_pool     = !!( classSetting & X.Class.POOL_OBJECT  );\r
                        opt_abstract = !!( classSetting & X.Class.ABSTRACT     );\r
                        opt_final    = !!( classSetting & X.Class.FINAL        );\r
@@ -328,16 +336,11 @@ X.Class = {
                \r
                // インスタンスのメンバー\r
                props = args[ 0 ];\r
-               if( !X.Type.isObject( props ) ){\r
-                       // サブクラスの場合、クラス定義の上書きがなくても作成可能\r
-                       // サブクラスでなくても、クラスメンバ用オブジェクトが無しでも作成可能\r
-                       //if( !X_Class_traits ){\r
-                       //      X.Logger.critical( 'No Class Def!' );\r
-                       //      return;\r
-                       //};\r
+               if( !X_Type_isObject( props ) ){\r
+                       // クラスメンバ用オブジェクトが無しでもクラスは作成可能\r
                        props = {};\r
                } else\r
-               if( props.Constructor && X.Type.isFunction( props.Constructor ) ){\r
+               if( props.Constructor && X_Type_isFunction( props.Constructor ) ){\r
                        classDef.Constructor = props.Constructor;\r
                };\r
 \r
@@ -534,7 +537,7 @@ function X_Class_inherits( /* displayName, classSetting, opt_PrivateClass, props
        if( superDef.Final ) X.Logger.critical( 'X.Class inherits, Class is final!' );\r
        \r
        // サブクラス名\r
-       if( X.Type.isString( displayName ) ){\r
+       if( X_Type_isString( displayName ) ){\r
                args.shift();\r
        } else {\r
                displayName = 'SubClass of ' + superDef.displayName;\r
@@ -543,7 +546,7 @@ function X_Class_inherits( /* displayName, classSetting, opt_PrivateClass, props
        \r
        // サブクラス設定\r
        classSetting = args[ 0 ];\r
-       if( X.Type.isNumber( classSetting ) ){\r
+       if( X_Type_isNumber( classSetting ) ){\r
                args.shift();\r
        } else {\r
                // クラス設定がない場合、親からコピーして、Abstract flag は落とす??\r
@@ -578,14 +581,9 @@ function X_Class_inherits( /* displayName, classSetting, opt_PrivateClass, props
        \r
        def    = X_Class_getClassDef( klass );\r
        // 継承用プロパティを控える\r
-       //if( opt_super === true ){\r
-               //def.superAccess = true;\r
-               def.SuperClass  = Super;\r
-               def.SuperProto  = Super.prototype;\r
-               def.SuperConstructor = superDef.Constructor || superDef.SuperConstructor;\r
-       // else {\r
-       //      def.SuperClass = Super; // instanceOf() で親クラスを調べる!\r
-       //};\r
+       def.SuperClass       = Super;\r
+       def.SuperProto       = Super.prototype;\r
+       def.SuperConstructor = superDef.Constructor || superDef.SuperConstructor;\r
        \r
        return klass;\r
 };\r
@@ -629,7 +627,7 @@ function X_Class_actualConstructor( f, args ){
                        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
+       if( ( X_Type_isObject( obj ) && obj !== instance ) || X_Type_isFunction( obj ) ){ // Class\r
                instance.kill();\r
                return obj;\r
        };\r