X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;ds=sidebyside;f=0.6.x%2Fjs%2F01_core%2F13_XClass.js;h=de840072b3c90c1531b8d702bad8c0cdac83df47;hb=dd4fcb6269ff74be253a767826aa5dfb96dd4acc;hp=292352056f5e014819b933db374802fb5bda77b0;hpb=7d0af2a7f884c146a48cd544a1f9ad44b82c0c1f;p=pettanr%2FclientJs.git
diff --git a/0.6.x/js/01_core/13_XClass.js b/0.6.x/js/01_core/13_XClass.js
index 2923520..de84007 100644
--- a/0.6.x/js/01_core/13_XClass.js
+++ b/0.6.x/js/01_core/13_XClass.js
@@ -20,12 +20,13 @@ var
X_Class_CLASS_LIST = [],
X_Class_DEF_LIST = [],
- X_Class_CALLING_SUPER = [],
- X_Class_CALL_SUPER_STACK = [],
+ X_Class_SUPER_CALLER = [],
+ X_Class_SUPER_STACKS = [],
X_Class_traits = null,
X_Class_useObjectCreate = false, // !!Object.create, http://jsperf.com/prototype-vs-object-create-perf
// Opera Mobile 12.10 Android11 IS01 ã§ã¯ã©ã¹ã®ã¡ã³ããæ¬ è½ããåé¡ã«ééã__proto__ ãè¾ããã¨åä½,,,
X_Class_use_proto_ = !X_UA[ 'OperaMobile' ] && !X_UA[ 'OperaTablet' ] && !!X_emptyFunction.prototype.__proto__,
+ X_Class_constructorFix = X_UA[ 'AOSP' ] < 3 || X_UA[ 'iOS' ] < 5,
X_Class_SEAL_KILLING = [],
X_Class_CommonMethods =
@@ -42,7 +43,7 @@ X_Class_CommonMethods =
*/
// TODO kill ããã¤ã³ã¹ã¿ã³ã¹ã®ã¤ãã³ããæ®ã£ã¦ããªããï¼ããã¯éçºç¨ã®ã¿
'kill' : function(){
- var listeners, flag, p, timers, def;
+ var listeners, flag, p, i, list, timers, def;
// TODO ç ´æ£æ¸ã®ã¤ã³ã¹ã¿ã³ã¹ã¸ã® kill
@@ -56,9 +57,9 @@ X_Class_CommonMethods =
// listeners ããªãå ´åãã¤ãã³ãã®ç»é²ããªããããBEFORE_KILL_INSTANCE ã¯å¼ã°ããªãã
// KILL_RESERVEDã== trueãã®å ´åãBEFORE_KILL_INSTANCE ã¯å¼ã°ããªãã
if( listeners && !listeners[ X_LISTENERS_KILL_RESERVED ] && listeners[ X_EVENT_BEFORE_KILL_INSTANCE ] ){
- X_Class_SEAL_KILLING[ X_Class_SEAL_KILLING.length ] = this;
+ X_Class_SEAL_KILLING[ i = X_Class_SEAL_KILLING.length ] = this;
- if( this[ 'dispatch' ]( X_EVENT_BEFORE_KILL_INSTANCE ) & X_Callback_PREVENT_DEFAULT ){
+ if( this[ 'dispatch' ]( X_EVENT_BEFORE_KILL_INSTANCE ) & X_CALLBACK_PREVENT_DEFAULT ){
this[ 'dispatch' ]( X_EVENT_KILL_INSTANCE_CANCELED );
// BEFORE_KILL_INSTANCE, KILL_INSTANCE_CANCELED å
㧠kill() ãã¦ã PREVENT_DEFAULT ã®å ´åã¯ãããç¡è¦ããã
flag = true;
@@ -66,7 +67,7 @@ X_Class_CommonMethods =
X_Class_SEAL_KILLING.length === 1 ?
( X_Class_SEAL_KILLING.length = 0 ) :
- X_Class_SEAL_KILLING.splice( X_Class_SEAL_KILLING.indexOf( this ), 1 );
+ X_Class_SEAL_KILLING.splice( X_Class_SEAL_KILLING[ i ] === this ? i : X_Class_SEAL_KILLING.indexOf( this ), 1 );
if( flag ) return;
};
@@ -78,17 +79,31 @@ X_Class_CommonMethods =
};
if( listeners[ X_EVENT_KILL_INSTANCE ] ){
- X_Class_SEAL_KILLING[ X_Class_SEAL_KILLING.length ] = this;
+ X_Class_SEAL_KILLING[ i = X_Class_SEAL_KILLING.length ] = this;
listeners[ X_LISTENERS_KILL_RESERVED ] = false;
this[ 'dispatch' ]( X_EVENT_KILL_INSTANCE );
X_Class_SEAL_KILLING.length === 1 ?
( X_Class_SEAL_KILLING.length = 0 ) :
- X_Class_SEAL_KILLING.splice( X_Class_SEAL_KILLING.indexOf( this ), 1 );
+ X_Class_SEAL_KILLING.splice( X_Class_SEAL_KILLING[ i ] === this ? i : X_Class_SEAL_KILLING.indexOf( this ), 1 );
+ };
+
+ if( !( listeners = this[ '_listeners' ] ) ){
+ for( p in listeners ){
+ //if( X_EMPTY_OBJECT[ opt_type ] ) continue;
+ if( p <= X_LISTENERS_KILL_RESERVED ) continue;
+ list = listeners[ p ];
+ for( i = list.length; i; ){
+ this[ 'unlisten' ]( p, list[ --i ] );
+ };
+ };
};
-
- X_EventDispatcher_unlistenAll( this );
+ };
+
+ if( this[ 'instanceOf' ]( Node ) ){
+ // console.log( 'KILL : ' + this.call( 'outerHTML' ) );
+ X_Node_onKill( this );
};
timers = X_EventDispatcher_LAZY_TIMERS;
@@ -113,7 +128,7 @@ X_Class_CommonMethods =
},
/**
- * é¢æ°ã¯ Constructor å
ã§ä½¿ç¨ãã¾ããã¯ã©ã¹å®ç¾©ã辿ã£ã¦ã¹ã¼ãã¼ã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãæ¢ãã¾ãã
+ * é¢æ°ã¯ Constructor å
ã§ä½¿ç¨ãã¾ããã¯ã©ã¹å®ç¾©ã辿ã£ã¦ã¹ã¼ãã¼ã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãå¼ã³åºãã¾ãã
* å
é¨çã«ã¯ãå¼ã³åºããã³ã³ã¹ãã©ã¯ã¿ã¯é
åã«æ§ã(X_Class_CALLING_SUPER)ãå¼ã³åºããã³ã³ã¹ãã©ã¯ã¿å
ã§ããã« Super ãå¼ã°ããå ´åãé
åãå
ã«ããã«ã¹ã¼ãã¼ãªã³ã³ã¹ãã©ã¯ã¿ã辿ãã¾ãã
* @example Constructor : function( arg1, arg2 ){
* this.Super( aeg1, arg2 );
@@ -123,95 +138,162 @@ X_Class_CommonMethods =
*/
// TODO ç¾å¨ new ãã¦ããã¤ã³ã¹ã¿ã³ã¹ãä¿æãã¦ãã§ãã¯ãã
'Super' : function( var_args ){
- var sClass = this,
- i = X_Class_CALLING_SUPER.indexOf( sClass ),
- n = -1,
- l, sList, def, sConst, ret;
+ var me = this,
+ sClass = me.constructor,
+ i = X_Class_SUPER_CALLER.indexOf( me ),
+ stack, t, def, ret;
if( i === -1 ){
- X_Class_CALLING_SUPER[ l = X_Class_CALLING_SUPER.length ] = sClass;
- X_Class_CALL_SUPER_STACK[ l ] = sList = [];
+ X_Class_SUPER_CALLER[ i = X_Class_SUPER_CALLER.length ] = me;
+ t = stack = X_Class_SUPER_STACKS[ i ] = 0;
} else {
- sList = X_Class_CALL_SUPER_STACK[ i ];
+ t = stack = X_Class_SUPER_STACKS[ i ];
+
+ while( t ){
+ sClass = X_Class_getClassDef( sClass ).SuperClass;
+ --t;
+ };
};
-
+
while( sClass ){
+ ++t;
+ sClass = X_Class_getClassDef( sClass ).SuperClass;
+ if( !sClass ) break;
def = X_Class_getClassDef( sClass );
- sClass = def.SuperClass;
- sConst = def.SuperConstructor;
- if( sConst && sList[ ++n ] !== sConst ){
- sList[ n ] = sConst;
- ret = sConst.apply( this, arguments );
- --sList.length;
- if( !sList.length ){
- X_Class_CALLING_SUPER.splice( i, 1 );
- X_Class_CALL_SUPER_STACK.splice( i, 1 );
- };
- return ret;
+
+ if( def.Constructor ){
+ X_Class_SUPER_STACKS[ i ] += t;
+ ret = def.Constructor.apply( me, arguments );
+ break;
};
};
- console.log( 'ã¹ã¼ãã¼ã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãè¦ã¤ããã¾ãã' );
+
+ // index ãæ¿ãã£ã¦ããå¯è½æ§ãããã®ã§åãç´ã
+ if( X_Class_SUPER_CALLER[ i ] !== me ) i = X_Class_SUPER_CALLER.indexOf( me );
+
+ if( X_Class_SUPER_STACKS[ i ] === stack ){
+ //console.log( 'ã¹ã¼ãã¼ã¯ã©ã¹ãã¾ãã¯ã¹ã¼ãã¼ã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ã¯åå¨ãã¾ãã' );
+ };
+
+ if( stack === 0 ){
+ X_Class_SUPER_CALLER.splice( i, 1 );
+ X_Class_SUPER_STACKS.splice( i, 1 );
+ } else {
+ X_Class_SUPER_STACKS[ i ] = stack;
+ };
+ return ret || me;
},
/**
- * func ã«ã¤ãã¦ã親ã¯ã©ã¹ã§è¨å®ããã¦ããååã®é¢æ°ã¡ã³ãã¼ãå¼ã³åºãã
- * 第ä¸å¼æ°ã«é¢æ°ãæå®ãã2ã¤ä»¥ä¸ã®ç°ãªãååã§åãé¢æ°ãã¡ã³ãã¼ãããå ´åãåä½ãä¸ç¢ºå®ã«ãªãã¾ãã
- * åè:ES5ãªJavascriptã§ã¢ãã³ãªã¯ã©ã¹çç¶æ¿ï¼ã¹ã¼ãã¼å¼ã³åºã
- * @param funcNameOrFunc {Function|string} ã¹ã¼ãã¼ã¯ã©ã¹ã®é¢æ°å ã¾ãã¯ããªã¼ãã¼ã©ã¤ãæ¸ã®èªèº«ã®é¢æ°ã
+ * myFunc ã«ã¤ãã¦ãã¹ã¼ãã¼ã¯ã©ã¹ã§è¨å®ããã¦ããååã®é¢æ°ãå¼ã³åºãã
+ * ä½éãªé¢æ°ãªã®ã§å¤ç¨ãããã¹ãã§ã¯ããã¾ããï¼
+ * 第ä¸å¼æ°ã«èªèº«ã®(èªèº«ããåç
§ã§ãã)é¢æ°ãæå®ãã¾ããå
é¨ã§ã¯é¢æ°åã調ã¹ãä¸ã§ prototype ãã§ã¼ã³ãã´ãªã´ãªè¾¿ããç¹å¥ãªãã¨ã¯ãã¦ãã¾ããã
+ * superCall 㨠Super ããã¹ãããå ´åãç¾å¨ã®ã¯ã©ã¹é層ã X_Class_SUPER_CALLER, X_Class_SUPER_STACKS ã使ã£ã¦æ§ãã¦ããã®ã§ãæå³ãã親é¢æ°ãå¼ã°ãã¾ãã
+ * 次ã®çç±ã«ãã£ã¦ãé¢æ°åã§è¾¿ããã¨ã¯éæ¨å¥¨ã§ãã
+ *