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