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
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
\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
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
};\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
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
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
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
// ------------------------------------------------------------------------- //\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
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
\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
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
\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
\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
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