OSDN Git Service

Version 0.6.35, bugfix.
[pettanr/clientJs.git] / 0.6.x / js / core / 04_XClass.js
index ac2c1a6..9fc4fd3 100644 (file)
@@ -18,22 +18,13 @@ X.Class = ( function(){
                killPrivateFlag    = false,\r
                traits             = null,\r
                _slice             = Array.prototype.slice;\r
-               \r
-       function copyArray( list ){\r
-       //return _slice.call( list, 0 );\r
-       var i = list.length, ret = [];\r
-       for( ; i; ){\r
-               ret[ --i ] = list[ i ];\r
-       };\r
-       return ret;\r
-       };\r
        \r
        /* サブクラスを作るメソッド  \r
         * var subClass = superClass.inherits( ... ) \r
         * http://d.hatena.ne.jp/m-hiyama/20051018/1129605002\r
         */\r
        function inherits( /* displayName, classSetting, opt_PrivateClass, props */ ){\r
-               var args        = copyArray( arguments ),\r
+               var args        = X.copyArray( arguments ),\r
                        params      = [],\r
                        Super       = this,\r
                        superDef    = X.Class._getClassDef( Super ),\r
@@ -41,40 +32,51 @@ X.Class = ( function(){
                        classSetting,\r
                        opt_super,\r
                        klass, def;\r
-               if( superDef.Final === true ) X.Notification.critical( 'X.Class inherits, Class is final!' );\r
+               if( superDef.Final ) X.Notification.critical( 'X.Class inherits, Class is final!' );\r
                \r
-               if( X.Type.isString( displayName ) === true ){\r
+               // サブクラス名\r
+               if( X.Type.isString( displayName ) ){\r
                        args.shift();\r
                } else {\r
                        displayName = 'SubClass of ' + superDef.displayName;\r
                };\r
                params.push( displayName );\r
                \r
+               // サブクラス設定\r
                classSetting = args[ 0 ];\r
-               if( X.Type.isNumber( classSetting ) === true ){\r
-                       if( superDef.isPrivate === true ) classSetting = classSetting | X.Class.PRIVATE_DATA;\r
-                       opt_super = !!( classSetting & X.Class.SUPER_ACCESS );\r
-                       params.push( classSetting );\r
+               if( X.Type.isNumber( classSetting ) ){\r
                        args.shift();\r
+               } else {\r
+                       classSetting = superDef.setting;\r
                };\r
+               if( superDef.isPrivate ) classSetting = classSetting | X.Class.PRIVATE_DATA;\r
+               opt_super = !!( classSetting & X.Class.SUPER_ACCESS );\r
+               params.push( classSetting );\r
+\r
+               // サブクラスのシャドウ\r
                if( X.Class._getClass( args[ 0 ] ) ){\r
                        params.push( args.shift() );\r
                } else\r
                if( superDef.privateClass ){\r
                        params.push( superDef.privateClass );\r
                };\r
-               params.push( args[ 0 ] ); /* props */\r
+               params.push( args[ 0 ] ); /* props サブクラスでは未定義でも可 */\r
+               \r
+               // 継承クラスの作成\r
                Super.__new = null;\r
                traits = new Super();\r
                Super.__new = C;\r
-               klass  = X.Class.create.apply( null, params );\r
+               klass  = X.Class.create.apply( X.Class, params );\r
                traits = null;\r
+               \r
+               // 継承用プロパティを控える\r
                if( opt_super === true ){\r
                        def = X.Class._getClassDef( klass );\r
                        def.Super = Super;\r
                        def.SuperProto = Super.prototype;\r
                        def.SuperConstructor = superDef[ CONSTRUCTOR ];\r
                };\r
+               \r
                return klass;\r
        };\r
        \r
@@ -176,7 +178,7 @@ X.Class = ( function(){
                SUPER_ACCESS : 8,\r
                PRIVATE_DATA : 16,\r
                create : function( /* displayName, classSetting, opt_PrivateClass, props */ ){\r
-                       var args        = copyArray( arguments ),\r
+                       var args        = X.copyArray( arguments ),\r
                                displayName = args[ 0 ],\r
                                classSetting,\r
                                opt_pool, opt_abstract, opt_final, opt_private,\r
@@ -188,19 +190,24 @@ X.Class = ( function(){
                                classDef.displayName = displayName;\r
                                args.shift();\r
                        };\r
-                       classSetting = args[ 0 ];\r
-                       if( X.Type.isNumber( classSetting ) === true ){\r
+                       \r
+                       // クラス設定\r
+                       classDef.setting = classSetting = args[ 0 ];\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
                                opt_private  = !!( classSetting & X.Class.PRIVATE_DATA );\r
-                               if( opt_final === true && opt_abstract === true ){\r
+                               if( opt_final && opt_abstract ){\r
                                        X.Notification.critical( 'final & Abstract!' );\r
                                        return;\r
-                               };                              \r
+                               };      \r
                                args.shift();\r
+                       } else {\r
+                               classDef.setting = 0;\r
                        };\r
                        \r
+                       // シャドウクラス\r
                        if( PRIVATE_CLASS_LIST.indexOf( args[ 0 ] ) !== -1 ){\r
                                privateDef = X.Class._getClassDef( args[ 0 ] );\r
                                if( privateDef.isPrivate !== true ){\r
@@ -213,13 +220,18 @@ X.Class = ( function(){
                                };\r
                                classDef.privateClass = args.shift();\r
                        };\r
-                       props = args[ 0 ];\r
-                       if( props === null || X.Type.isObject( props ) === false ){\r
-                               X.Notification.critical( 'No Class Def!' );\r
-                               return;\r
-                       };\r
                        \r
-                       if( props[ CONSTRUCTOR ] && X.Type.isFunction( props[ CONSTRUCTOR ] ) === true ){\r
+                       // インスタンスのメンバー\r
+                       props = args[ 0 ];\r
+                       if( props === null || !X.Type.isObject( props ) ){\r
+                               // サブクラスの場合、クラス定義の上書きがなくても作成可能\r
+                               if( !traits ){\r
+                                       X.Notification.critical( 'No Class Def!' );\r
+                                       return;                                 \r
+                               };\r
+                               props = {};\r
+                       } else\r
+                       if( props[ CONSTRUCTOR ] && X.Type.isFunction( props[ CONSTRUCTOR ] ) ){\r
                                classDef[ CONSTRUCTOR ] = props[ CONSTRUCTOR ];\r
                        };\r
                        \r
@@ -289,7 +301,7 @@ X.Class = ( function(){
                        if( PRIVATE_DEF_LIST.indexOf( KlassOrInstance ) !== -1 ) return KlassOrInstance;\r
                },\r
                _newPrivate : function( /* instance, args */ ){\r
-                       var args         = copyArray( arguments ),\r
+                       var args         = X.copyArray( arguments ),\r
                                user         = args.shift(),\r
                                def          = X.Class._getClassDef( user ),\r
                                privateClass = def.privateClass,\r