OSDN Git Service

Version 0.6.73, move ._rawNode from X.Dom.Event to X.EventDispatcher.
[pettanr/clientJs.git] / 0.6.x / js / 00_core / 04_XClass.js
index e5e8b40..2de9d36 100644 (file)
@@ -17,8 +17,9 @@ X.Class = ( function(){
                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
@@ -47,7 +48,8 @@ X.Class = ( function(){
                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
@@ -63,6 +65,9 @@ X.Class = ( function(){
                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
@@ -84,7 +89,10 @@ X.Class = ( function(){
                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
@@ -98,6 +106,7 @@ X.Class = ( function(){
                        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
@@ -120,6 +129,10 @@ X.Class = ( function(){
                                };\r
                        };\r
                },\r
+               \r
+               // Super\r
+               // SuperCall\r
+               \r
                instanceOf : function( klass ){\r
                        var Super = this;\r
                        if( this.constructor === klass ) return true;\r
@@ -139,7 +152,7 @@ X.Class = ( function(){
                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
@@ -150,7 +163,11 @@ X.Class = ( function(){
                        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
@@ -162,14 +179,18 @@ X.Class = ( function(){
                        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
@@ -248,6 +269,10 @@ X.Class = ( function(){
                        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