{\r
/*\r
* インスタンスの破棄。\r
+ * TODO kill したインスタンスのイベントが残っていないか?これは開発用のみ\r
*/\r
kill : function(){\r
var instance = this,\r
};\r
},\r
\r
- // TODO Super\r
- // superCall\r
+ /* クラス定義を辿ってスーパークラスのコンストラクタを探す。\r
+ * 呼び出したコンストラクタは配列に控える。\r
+ * さらに呼ばれた場合、配列を元にさらに奥のコンストラクタを取得\r
+ * TODO 現在 new しているインスタンスを保持してチェックする\r
+ */\r
+ Super : function(){\r
+ var sClass = this,\r
+ i = X_Class_CALLING_SUPER.indexOf( sClass ),\r
+ n = -1,\r
+ l, sList, def, sConst, ret;\r
+ \r
+ if( i === -1 ){\r
+ X_Class_CALLING_SUPER[ l = X_Class_CALLING_SUPER.length ] = sClass;\r
+ X_Class_CALL_SUPER_STACK[ l ] = sList = [];\r
+ } else {\r
+ sList = X_Class_CALL_SUPER_STACK[ i ];\r
+ };\r
+ \r
+ while( sClass ){\r
+ def = X_Class_getClassDef( sClass );\r
+ sClass = def.SuperClass;\r
+ sConst = def.SuperConstructor;\r
+ if( sConst && sList[ ++n ] !== sConst ){\r
+ sList[ n ] = sConst;\r
+ ret = sConst.apply( this, arguments );\r
+ --sList.length;\r
+ if( !sList.length ){\r
+ X_Class_CALLING_SUPER.splice( i, 1 );\r
+ X_Class_CALL_SUPER_STACK.splice( i, 1 );\r
+ };\r
+ return ret;\r
+ };\r
+ };\r
+ console.log( 'スーパークラスのコンストラクタが見つかいません' );\r
+ },\r
+\r
+ /*\r
+ * func について、親クラスで設定されている同名の関数メンバーを呼び出す\r
+ * 2つ以上の異なる名前で同じ関数がメンバーだった場合、失敗します\r
+ * 例) this.superCall( arguments.callee, param0, param1, ... )\r
+ */\r
+ superCall : function( func /* ...args */ ){\r
+ var sClass = this,\r
+ args = arguments,\r
+ name, p, sFunc, hit = false;\r
+ if( X.Type.isFunction( func ) ){\r
+ for( p in this ){\r
+ if( this[ p ] === func ){\r
+ name = p;\r
+ break;\r
+ };\r
+ };\r
+ if( !name ) return;\r
+ } else {\r
+ return;\r
+ };\r
+ \r
+ if( X_EMPTY_OBJECT[ name ] ) return;\r
+ \r
+ while( sClass ){\r
+ def = X_Class_getClassDef( sClass );\r
+ sClass = def.SuperClass;\r
+ sFunc = sClass.prototype[ name ];\r
+ if( sFunc === func ){\r
+ hit = true; // 現在の関数にヒット\r
+ } else\r
+ if( hit && X_Object_inObject( name, this ) ){\r
+ if( X.Type.isFunction( sFunc ) ){\r
+ switch( args.length ){\r
+ case 1 :\r
+ return sFunc.call( this );\r
+ case 2 :\r
+ return sFunc.call( this, args[ 1 ] );\r
+ case 3 :\r
+ return sFunc.call( this, args[ 1 ], args[ 2 ] );\r
+ case 4 :\r
+ return sFunc.call( this, args[ 1 ], args[ 2 ], args[ 3 ] );\r
+ default :\r
+ args = X.Object.cloneArray( args );\r
+ args.shift();\r
+ return sFunc.apply( this, args );\r
+ };\r
+ };\r
+ break;\r
+ };\r
+ };\r
+ },\r
\r
+ /*\r
+ * TODO instanceof に対応したブラウザはそちらを使用\r
+ */\r
instanceOf : function( klass ){\r
var Super = this;\r
if( this.constructor === klass ) return true;\r
return false;\r
}\r
};\r
+\r
+\r
// ------------------------------------------------------------------------- //\r
// --- interface ----------------------------------------------------------- //\r
// ------------------------------------------------------------------------- //\r
function X_Class_override( target, src, force ){\r
var p;\r
for( p in src ){\r
- if( p === 'Super' || p === 'SuperConstructor' || p === '__proto__' || p === 'prototype' || p === 'constructor' ){\r
- X.Logger.critical( 'Super & SuperConstructor is reserved!' );\r
+ if( p === '__proto__' || p === 'prototype' || p === 'constructor' ){\r
+ X.Logger.critical( p + ' is reserved!' );\r
return;\r
};\r
if( force || target[ p ] === void 0 ){\r
superDef = X_Class_getClassDef( Super ),\r
displayName = args[ 0 ],\r
classSetting,\r
- opt_super,\r
+ //opt_super,\r
klass, def;\r
if( superDef.Final ) X.Logger.critical( 'X.Class inherits, Class is final!' );\r
\r
classSetting = superDef.setting;// &= ~X.Class.ABSTRACT;\r
};\r
if( superDef.isPrivate ) classSetting = classSetting | X.Class.PRIVATE_DATA;\r
- opt_super = !!( classSetting & X.Class.SUPER_ACCESS );\r
+ //opt_super = !!( classSetting & X.Class.SUPER_ACCESS );\r
params.push( classSetting );\r
\r
// サブクラスのシャドウ\r
if( superDef.privateClass ){\r
params.push( superDef.privateClass );\r
};\r
- params.push( args[ 0 ] ); /* props サブクラスでは未定義でも可 */\r
+ \r
+ /* props 未定義でも可 */\r
+ params.push( args[ 0 ] );\r
\r
// 継承クラスの作成\r
if( X_Class_useObjectCreate ){\r
if( X_Class_use_proto_ ){\r
X_Class_traits = Super.prototype;\r
} else {\r
- //Super.__new = null;\r
X_Class_traits = new Super( X_Closure_COMMAND_DROP );\r
- //Super.__new = X_Class_actualConstructor; \r
};\r
klass = X.Class.create.apply( X.Class, params );\r
X_Class_traits = null;\r
\r
def = X_Class_getClassDef( klass );\r
// 継承用プロパティを控える\r
- if( opt_super === true ){\r
- def.superAccess = true;\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
+ // else {\r
+ // def.SuperClass = Super; // instanceOf() で親クラスを調べる!\r
+ //};\r
\r
return klass;\r
};\r
X.Logger.critical( 'use myClass.newPrivate( instance, ...args )!' );\r
return;\r
};\r
- //klass.__new = null;\r
+ \r
instance = def.pool && def.pool.length > 0 ?\r
def.pool.pop() :\r
X_Class_useObjectCreate ?\r
Object.create( klass.prototype ) :\r
new klass( X_Closure_COMMAND_DROP );\r
- //klass.__new = X_Class_actualConstructor;\r
\r
if( def.isPrivate ){\r
userDef = X_Class_getClassDef( dataUser );\r
} else {\r
def.live && def.live.push( instance );\r
};\r
- if( def.superAccess ){\r
+ //if( def.superAccess ){\r
// TODO klass.prototype に移動\r
- instance.Super = def.SuperProto;\r
- instance.SuperConstructor = X_Class_superConstructor;\r
- };\r
+ //instance.Super = def.SuperProto;\r
+ //instance.SuperConstructor = X_Class_superConstructor;\r
+ //};\r
obj = def.Constructor ?\r
def.Constructor.apply( instance, args ) :\r
def.SuperConstructor &&\r
};\r
return instance;\r
};\r
-/* クラス定義を辿ってスーパークラスのコンストラクタを探す。\r
- * 呼び出したコンストラクタは配列に控える。\r
- * さらに呼ばれた場合、配列を元にさらに奥のコンストラクタを取得\r
- * TODO 現在 new しているインスタンスを保持してチェックする\r
- */\r
-function X_Class_superConstructor(){\r
- var sClass = this,\r
- i = X_Class_CALLING_SUPER.indexOf( sClass ),\r
- n = -1,\r
- l, sList, def, sConst, ret;\r
-\r
- if( i === -1 ){\r
- X_Class_CALLING_SUPER[ l = X_Class_CALLING_SUPER.length ] = sClass;\r
- X_Class_CALL_SUPER_STACK[ l ] = sList = [];\r
- } else {\r
- sList = X_Class_CALL_SUPER_STACK[ i ];\r
- };\r
- \r
- while( sClass ){\r
- def = X_Class_getClassDef( sClass );\r
- sClass = def.SuperClass;\r
- sConst = def.SuperConstructor;\r
- if( sConst && sList[ ++n ] !== sConst ){\r
- sList[ n ] = sConst;\r
- ret = sConst.apply( this, arguments );\r
- --sList.length;\r
- if( !sList.length ){\r
- X_Class_CALLING_SUPER.splice( i, 1 );\r
- X_Class_CALL_SUPER_STACK.splice( i, 1 );\r
- };\r
- return ret;\r
- };\r
- };\r
-};\r
\r
console.log( 'X.Core.Class' );\r
\r
/**\r
* _rawObject には HTMLElement, window, document, XHR といったイベントターゲットオブジェクトを設定します。\r
- * _rawObject が設定されていると on(), off() 時に addEventListener(DOM Level2) や detachEvent(ie5~8), on~(DOM0) 等を操作します。\r
- * _rawObject は最初の on() 前に設定しておかないと addEventListener 等が意図したように行われません。\r
+ * _rawObject が設定されていると listen(), unlisten() 時に addEventListener(DOM Level2) や detachEvent(ie5~8), on~(DOM0) 等を操作します。\r
+ * _rawObject は最初の listen() 前に設定しておかないと addEventListener 等が意図したように行われません。\r
* X.Node では非同期に HTMLElement を生成していて、要素生成以前に on, off を呼び出すことができます。これは適宜に migrateEvent, restoreEvent を呼んで解決しているためです。\r
* @private\r
* @type {Object}\r
* @param {(eventHash|string|number)} e\r
*/ \r
dispatch : X_EventDispatcher_dispatch,\r
-\r
- /**\r
- * @function\r
- */\r
- on : X_EventDispatcher_listen,\r
\r
/**\r
* \r
X_EventDispatcher_once = false;\r
return this;\r
},\r
- \r
- off : X_EventDispatcher_unlisten,\r
+\r
unlisten : X_EventDispatcher_unlisten,\r
\r
/**\r
list.slcallback = X_Callback_create( that, X_EventDispatcher_sliverLightDispatch, [ type ] );\r
list.sltoken = raw.AddEventListener( type, list.slcallback );\r
} else\r
- if( X.UA.iOS && type === 'webkitTransitionEnd' ){\r
+ if( X.UA.iOS && ( type === 'webkitTransitionEnd' || type === 'transitionend' ) ){\r
raw.addEventListener( type, X_EventDispatcher_iOSTransitionEndDispatch, false );\r
} else {\r
console.log( 'event > ' + type );\r
delete list.sltoken;\r
delete list.slcallback;\r
} else\r
- if( X.UA.iOS && type === 'webkitTransitionEnd' ){\r
+ if( X.UA.iOS && ( type === 'webkitTransitionEnd' || type === 'transitionend' ) ){\r
raw.removeEventListener( type, X_EventDispatcher_iOSTransitionEndDispatch, false );\r
} else {\r
\r