*/\r
// TODO kill したインスタンスのイベントが残っていないか?これは開発用のみ\r
'kill' : function(){\r
- var listeners, flag, p, timers, def;\r
+ var listeners, flag, p, i, list, timers, def;\r
\r
// TODO 破棄済のインスタンスへの kill\r
\r
// listeners がない場合、イベントの登録がないため、BEFORE_KILL_INSTANCE は呼ばれない。\r
// KILL_RESERVED == true の場合、BEFORE_KILL_INSTANCE は呼ばれない。\r
if( listeners && !listeners[ X_LISTENERS_KILL_RESERVED ] && listeners[ X_EVENT_BEFORE_KILL_INSTANCE ] ){\r
- X_Class_SEAL_KILLING[ X_Class_SEAL_KILLING.length ] = this;\r
+ X_Class_SEAL_KILLING[ i = X_Class_SEAL_KILLING.length ] = this;\r
\r
if( this[ 'dispatch' ]( X_EVENT_BEFORE_KILL_INSTANCE ) & X_CALLBACK_PREVENT_DEFAULT ){\r
this[ 'dispatch' ]( X_EVENT_KILL_INSTANCE_CANCELED );\r
\r
X_Class_SEAL_KILLING.length === 1 ?\r
( X_Class_SEAL_KILLING.length = 0 ) :\r
- X_Class_SEAL_KILLING.splice( X_Class_SEAL_KILLING.indexOf( this ), 1 );\r
+ X_Class_SEAL_KILLING.splice( X_Class_SEAL_KILLING[ i ] === this ? i : X_Class_SEAL_KILLING.indexOf( this ), 1 );\r
\r
if( flag ) return;\r
};\r
};\r
\r
if( listeners[ X_EVENT_KILL_INSTANCE ] ){\r
- X_Class_SEAL_KILLING[ X_Class_SEAL_KILLING.length ] = this;\r
+ X_Class_SEAL_KILLING[ i = X_Class_SEAL_KILLING.length ] = this;\r
\r
listeners[ X_LISTENERS_KILL_RESERVED ] = false; \r
this[ 'dispatch' ]( X_EVENT_KILL_INSTANCE );\r
\r
X_Class_SEAL_KILLING.length === 1 ?\r
( X_Class_SEAL_KILLING.length = 0 ) :\r
- X_Class_SEAL_KILLING.splice( X_Class_SEAL_KILLING.indexOf( this ), 1 );\r
+ X_Class_SEAL_KILLING.splice( X_Class_SEAL_KILLING[ i ] === this ? i : X_Class_SEAL_KILLING.indexOf( this ), 1 );\r
+ };\r
+\r
+ if( !( listeners = this[ '_listeners' ] ) ){\r
+ for( p in listeners ){\r
+ //if( X_EMPTY_OBJECT[ opt_type ] ) continue;\r
+ if( p <= X_LISTENERS_KILL_RESERVED ) continue;\r
+ list = listeners[ p ];\r
+ for( i = list.length; i; ){\r
+ this[ 'unlisten' ]( p, list[ --i ] );\r
+ };\r
+ }; \r
};\r
- \r
- X_EventDispatcher_unlistenAll( this );\r
};\r
\r
if( this[ 'instanceOf' ]( Node ) ){\r
};\r
};\r
\r
+ // index が替わっている可能性があるので取り直し\r
+ if( X_Class_SUPER_CALLER[ i ] !== me ) i = X_Class_SUPER_CALLER.indexOf( me );\r
+ \r
if( X_Class_SUPER_STACKS[ i ] === stack ) console.log( 'スーパークラス、またはスーパークラスのコンストラクタは存在しません' );\r
\r
if( stack === 0 ){\r
sFunc = sClass.prototype[ name ];\r
\r
if( sFunc !== myFunc /* X_Object_own( name, sClass.prototype ) */ ){\r
- // this の関数と異なり、値が設定されていたら、今は手を抜いて undef か?見ている、正しくは hasOwnProperty\r
if( X_Type_isFunction( sFunc ) ){\r
X_Class_SUPER_STACKS[ i ] += t;\r
switch( args.length ){\r
- case 0 :\r
- ret = sFunc.call( me );\r
- break;\r
case 1 :\r
- ret = sFunc.call( me, args[ 0 ] );\r
+ ret = sFunc.call( me );\r
break;\r
case 2 :\r
- ret = sFunc.call( me, args[ 0 ], args[ 1 ] );\r
+ ret = sFunc.call( me, args[ 1 ] );\r
break;\r
case 3 :\r
- ret = sFunc.call( me, args[ 0 ], args[ 1 ], args[ 2 ] );\r
+ ret = sFunc.call( me, args[ 1 ], args[ 2 ] );\r
+ break;\r
+ case 4 :\r
+ ret = sFunc.call( me, args[ 1 ], args[ 2 ], args[ 3 ] );\r
break;\r
default :\r
args = X_Array_copy( args );\r
};\r
};\r
\r
+ // index が替わっている可能性があるので取り直し\r
+ if( X_Class_SUPER_CALLER[ i ] !== me ) i = X_Class_SUPER_CALLER.indexOf( me );\r
+\r
if( stack === 0 ){\r
X_Class_SUPER_CALLER.splice( i, 1 );\r
X_Class_SUPER_STACKS.splice( i, 1 );\r