X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=0.6.x%2Fjs%2F01_core%2F11_XClass.js;h=52207a519a1b9bcc6e7669be88166ed9df8c0189;hb=42e0982b02a99c71702ce8cd8740645aefdc8097;hp=815e4c19321ba5c16e84a61986871772b37a507c;hpb=a130cabd01fde8865990a59d849f5d5d08ed2119;p=pettanr%2FclientJs.git diff --git a/0.6.x/js/01_core/11_XClass.js b/0.6.x/js/01_core/11_XClass.js index 815e4c1..52207a5 100644 --- a/0.6.x/js/01_core/11_XClass.js +++ b/0.6.x/js/01_core/11_XClass.js @@ -27,7 +27,7 @@ var X_Class_killPrivateFlag = false, X_Class_traits = null, X_Class_useObjectCreate = false, // !!Object.create, http://jsperf.com/prototype-vs-object-create-perf - X_Class_use_proto_ = !X_UA[ 'OperaMobile' ] && !X_UA[ 'OperaTablet' ] && !!X.emptyFunction.prototype.__proto__, + X_Class_use_proto_ = !X_UA[ 'OperaMobile' ] && !X_UA[ 'OperaTablet' ] && !!X_emptyFunction.prototype.__proto__, // Opera Mobile 12.10 Android11 IS01 でクラスのメンバが欠落する問題に遭遇。__proto__ を使わないと動作,,, X_Class_CommonMethods = @@ -37,13 +37,13 @@ X_Class_CommonMethods = * 全ての動的メンバを削除して、インスタンスを破棄する。
* インスタンスが X.EventDispatcher とそのサブクラスの場合、次の動作をする。 *
    - *
  1. X.Event.BEFORE_KILL_INSTANCE を発火する。戻り値のビットフラグに X.Callback.PREVENT_DEFAULT が立つ場合、破棄をキャンセルし X.Event.KILL_INSTANCE_CANCELED を発火する。 + *
  2. X.Event.BEFORE_KILL_INSTANCE を発火する。戻り値のビットフラグに X_Callback_PREVENT_DEFAULT が立つ場合、破棄をキャンセルし X.Event.KILL_INSTANCE_CANCELED を発火する。 *
  3. 破棄に進む場合は、X.Event.KILL_INSTANCE を発火する。 *
  4. dispatch 中は、インスタンスの全ての dispatch が終了するまで実際の破棄を待つ。 *
  5. 実際の破棄では、インスタンスのメンバの削除に加えて全てのイベントリスナを解除する。 */ // TODO kill したインスタンスのイベントが残っていないか?これは開発用のみ - kill : function(){ + 'kill' : function(){ var instance = this, klass = X_Class_getClass( instance ), def = X_Class_getClassDef( klass ), @@ -54,10 +54,10 @@ X_Class_CommonMethods = }; X_Class_killPrivateFlag = false; // instance.kill() 内で PrivateInstance.kill() を防ぐため - if( this.instanceOf( X.EventDispatcher ) ){ + if( this[ 'instanceOf' ]( X_EventDispatcher ) ){ if( !def.isPrivate ){ - if( this.dispatch( X_Event.BEFORE_KILL_INSTANCE ) & X.Callback.PREVENT_DEFAULT ){ - this.dispatch( X_Event.KILL_INSTANCE_CANCELED ); + if( this[ 'dispatch' ]( X_EVENT_BEFORE_KILL_INSTANCE ) & X_Callback_PREVENT_DEFAULT ){ + this[ 'dispatch' ]( X_EVENT_KILL_INSTANCE_CANCELED ); return; }; if( this[ '_listeners' ] && this[ '_listeners' ][ X_Listeners_.DISPATCHING ] ){ @@ -65,18 +65,18 @@ X_Class_CommonMethods = return; }; } else { - this.dispatch( X_Event.BEFORE_KILL_INSTANCE ); + this[ 'dispatch' ]( X_EVENT_BEFORE_KILL_INSTANCE ); }; // asyncDispatch の削除 for( p in X_EventDispatcher_LAZY_TIMERS ){ if( X_EventDispatcher_LAZY_TIMERS[ p ] === this ){ delete X_EventDispatcher_LAZY_TIMERS[ p ]; // 削除が先!理由は X.Timer.removeを確認。 - X.Timer.remove( parseFloat( p ) ); + X_Timer_remove( parseFloat( p ) ); }; }; - this.dispatch( X_Event.KILL_INSTANCE ); + this[ 'dispatch' ]( X_EVENT_KILL_INSTANCE ); this._listeners && X_EventDispatcher_systemUnlisten( this ); }; @@ -92,11 +92,11 @@ X_Class_CommonMethods = i = def.userList.indexOf( instance ); if( i !== -1 ){ data = X_Class_getPrivate( instance ); - if( data[ '_listeners' ] && data[ '_listeners' ][ X_Listeners_.DISPATCHING ] && data.instanceOf( X.EventDispatcher ) ){ + if( data[ '_listeners' ] && data[ '_listeners' ][ X_Listeners_.DISPATCHING ] && data[ 'instanceOf' ]( X.EventDispatcher ) ){ data[ '_listeners' ][ X_Listeners_.KILL_RESERVED ] = true; } else { X_Class_killPrivateFlag = true; - data.kill(); + data[ 'kill' ](); }; def.dataList.splice( i, 1 ); def.userList.splice( i, 1 ); @@ -114,7 +114,7 @@ X_Class_CommonMethods = * @return {*} */ // TODO 現在 new しているインスタンスを保持してチェックする - Super : function( var_args ){ + 'Super' : function( var_args ){ var sClass = this, i = X_Class_CALLING_SUPER.indexOf( sClass ), n = -1, @@ -154,7 +154,7 @@ X_Class_CommonMethods = * @example return this.superCall( arguments.callee, param0, param1, ... ); * @return {*} オーバーライド元の関数を呼び出した戻り値。 */ - superCall : function( funcNameOrFunc, var_args ){ + 'superCall' : function( funcNameOrFunc, var_args ){ var sClass = this, args = arguments, name, p, sFunc, hit = false; @@ -191,7 +191,7 @@ X_Class_CommonMethods = case 4 : return sFunc.call( this, args[ 1 ], args[ 2 ], args[ 3 ] ); default : - args = X.Object.cloneArray( args ); + args = X_Object_cloneArray( args ); args.shift(); return sFunc.apply( this, args ); }; @@ -209,7 +209,7 @@ X_Class_CommonMethods = * @return {boolean} */ // TODO instanceof に対応したブラウザはそちらを使用 - instanceOf : function( klass ){ + 'instanceOf' : function( klass ){ var Super = this; if( this.constructor === klass ) return true; while( Super = X_Class_getClassDef( Super ).SuperClass ){ @@ -243,54 +243,77 @@ X_Class_CommonMethods = * @namespace X.Class * @alias X.Class */ -X.Class = { +X[ 'Class' ] = { /** * 設定なし。 + * @const */ - NONE : 0, + 'NONE' : 0, /** * インスタンスは破棄時(this.kill())に回収され、次回の new MyClass() 時に再利用されます。 + * @const */ - POOL_OBJECT : 1, + 'POOL_OBJECT' : 1, /** * 定義するクラスは抽象クラスになります。new AbstractClass() とするとエラーになります。 + * @const */ - ABSTRACT : 2, + 'ABSTRACT' : 2, /** * クラスの継承を禁止する。 + * @const */ - FINAL : 4, + 'FINAL' : 4, /** * 使用を中止。petanR ライブラリ使用プロジェクトから SUPER_ACCESS を消したらここも削除。 + * @const */ - SUPER_ACCESS : 8, + 'SUPER_ACCESS' : 8, /** * 内部コード、主に X.UI フレームワークに対して、フレーム外に露出するインスタンスとペアで動作する、シャドウなインスタンスの使用を宣言する。 * Javascript はインスタンス毎のカプセル化がとてもコスト高。微妙なコスト増で隠蔽されたインスタンスを使う。 + * @const */ - PRIVATE_DATA : 16, + 'PRIVATE_DATA' : 16, /** * 未実装。でも目印になるので付けておきましょう。 + * @const */ - SINGLETON : 32, + 'SINGLETON' : 32, + 'create' : X_Class_create, + + // TODO collect + + '_newPrivate' : X_Class_newPrivate, + + '_getPrivate' : X_Class_getPrivate + +}; + + + +// ------------------------------------------------------------------------- // +// --- implements ---------------------------------------------------------- // +// ------------------------------------------------------------------------- // /** * クラスを定義する。
    * X.Class.create() によるクラス定義は必ずしもコンストラクタを必要としません。クラス定義時にコンストラクタが未設定の場合、スーパークラスがあればそのコンストラクタを使用します。 + * @alias X.Class.create * @param {string} [displayName] クラスの名前 * @param {number} [classSetting=0] X.Class.POOL_OBJECT | X.Class.FINAL など * @param {__ClassBase__=} [privateClass] このクラスとペアで動作するシャドウクラス * @param {object} [props={}] このクラスのメンバと関数。コンストラクタは Constructor と書くこと * @return {__ClassBase__} */ - create : function( /* displayName, classSetting, privateClass, props */ ){ + function X_Class_create( /* displayName, classSetting, privateClass, props */ ){ var args = X_Object_cloneArray( arguments ), displayName = args[ 0 ], classSetting, @@ -340,14 +363,14 @@ X.Class = { // クラスメンバ用オブジェクトが無しでもクラスは作成可能 props = {}; } else - if( props.Constructor && X_Type_isFunction( props.Constructor ) ){ - classDef.Constructor = props.Constructor; + if( props[ 'Constructor' ] && X_Type_isFunction( props[ 'Constructor' ] ) ){ + classDef.Constructor = props[ 'Constructor' ]; }; - klass = X_Callback_actualClosure( hash = { _ : X_Class_actualConstructor } ); // TODO hash = classDef - hash.c = klass; - klass.superClassOf = X_Class_superClassOf; - klass.subClassOf = X_Class_subClassOf; + klass = X_Callback_actualClosure( hash = { proxy : X_Class_actualConstructor } ); // TODO hash = classDef + hash.klass = klass; + klass[ 'superClassOf' ] = X_Class_superClassOf; + klass[ 'subClassOf' ] = X_Class_subClassOf; if( X_Class_useObjectCreate ){ klass.prototype = X_Class_override( X_Class_override( X_Class_traits || klass.prototype, props, true ), X_Class_CommonMethods, false ); @@ -365,7 +388,7 @@ X.Class = { klass.prototype.constructor = klass; }; - klass.name = displayName; + klass[ 'name' ] = displayName; if( opt_abstract ){ classDef.Abstract = true; @@ -377,7 +400,7 @@ X.Class = { if( opt_final ){ classDef.Final = true; } else { - klass.inherits = X_Class_inherits; + klass[ 'inherits' ] = X_Class_inherits; }; if( opt_private ){ if( classDef.privateClass ){ @@ -392,19 +415,10 @@ X.Class = { X_Class_DEF_LIST.push( classDef ); }; return klass; - }, - - _newPrivate : X_Class_newPrivate, - - _getPrivate : X_Class_getPrivate - -}; + }; -// ------------------------------------------------------------------------- // -// --- implements ---------------------------------------------------------- // -// ------------------------------------------------------------------------- // function X_Class_getClass( instance ){ var cList = X_Class_CLASS_LIST, i = cList.length, @@ -593,7 +607,7 @@ function X_Class_inherits( /* displayName, classSetting, opt_PrivateClass, props * これにより pool された オブジェクト(破棄されたインスタンス) を再利用できる */ function X_Class_actualConstructor( f, args ){ - var klass = f.c, + var klass = f.klass, def = X_Class_getClassDef( klass ), dataUser = def._tempUser, instance, obj, @@ -628,7 +642,7 @@ function X_Class_actualConstructor( f, args ){ def.SuperConstructor && def.SuperConstructor.apply( instance, args ); if( ( X_Type_isObject( obj ) && obj !== instance ) || X_Type_isFunction( obj ) ){ // Class - instance.kill(); + instance[ 'kill' ](); return obj; }; return instance;