X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=0.6.x%2Fjs%2F01_core%2F13_XClass.js;h=a0b15cc797cedaa73579b0b9a6e47990fd7d5fae;hb=2bea17ee282c2cf4ce0de6685db3ade602f6e60f;hp=dc1166b8c3a3c03e71644ed1cea7290709f64ec9;hpb=35daae003b3b017a92d0c883f120bf3baf604fba;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 dc1166b..a0b15cc 100644
--- a/0.6.x/js/01_core/13_XClass.js
+++ b/0.6.x/js/01_core/13_XClass.js
@@ -20,8 +20,6 @@ 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,
@@ -38,14 +36,14 @@ X_Class_CommonMethods =
* å
¨ã¦ã®åçã¡ã³ããåé¤ãã¦ãã¤ã³ã¹ã¿ã³ã¹ãç ´æ£ããã
* ã¤ã³ã¹ã¿ã³ã¹ã X.EventDispatcher ã¨ãã®ãµãã¯ã©ã¹ã®å ´åã次ã®åä½ãããã
*
- * - X.Event.BEFORE_KILL_INSTANCE ãçºç«ãããæ»ãå¤ã®ããããã©ã°ã« X_Callback.PREVENT_DEFAULT ãç«ã¤å ´åãç ´æ£ããã£ã³ã»ã«ã X.Event.KILL_INSTANCE_CANCELED ãçºç«ããããã®éã« kill() ãå¼ã°ãã¦ãç¡è¦ãããã
+ *
- X.Event.BEFORE_KILL_INSTANCE ãçºç«ãããæ»ãå¤ã®ããããã©ã°ã« X.Callback.PREVENT_DEFAULT ãç«ã¤å ´åãç ´æ£ããã£ã³ã»ã«ã X.Event.KILL_INSTANCE_CANCELED ãçºç«ããããã®éã« kill() ãå¼ã°ãã¦ãç¡è¦ãããã
*
- ç ´æ£ã«é²ãå ´åã¯ãX.Event.KILL_INSTANCE ãçºç«ããã
*
- dispatch ä¸ã¯ãã¤ã³ã¹ã¿ã³ã¹ã®å
¨ã¦ã® dispatch ãçµäºããã¾ã§å®éã®ç ´æ£ãå¾
ã¤ã
*
- å®éã®ç ´æ£ã§ã¯ãã¤ã³ã¹ã¿ã³ã¹ã®ã¡ã³ãã®åé¤ã«å ãã¦å
¨ã¦ã®ã¤ãã³ããªã¹ãã解é¤ããã
*/
// TODO kill ããã¤ã³ã¹ã¿ã³ã¹ã®ã¤ãã³ããæ®ã£ã¦ããªããï¼ããã¯éçºç¨ã®ã¿
'kill' : function(){
- var listeners, flag, p, timers, def;
+ var listeners, flag, p, i, list, timers, def;
// TODO ç ´æ£æ¸ã®ã¤ã³ã¹ã¿ã³ã¹ã¸ã® kill
@@ -59,7 +57,7 @@ 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 ){
this[ 'dispatch' ]( X_EVENT_KILL_INSTANCE_CANCELED );
@@ -69,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;
};
@@ -81,17 +79,26 @@ 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 ) ){
@@ -121,7 +128,7 @@ X_Class_CommonMethods =
},
/**
- * é¢æ°ã¯ Constructor å
ã§ä½¿ç¨ãã¾ããã¯ã©ã¹å®ç¾©ã辿ã£ã¦ã¹ã¼ãã¼ã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãæ¢ãã¾ãã
+ * é¢æ°ã¯ Constructor å
ã§ä½¿ç¨ãã¾ããã¯ã©ã¹å®ç¾©ã辿ã£ã¦ã¹ã¼ãã¼ã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãå¼ã³åºãã¾ãã
* å
é¨çã«ã¯ãå¼ã³åºããã³ã³ã¹ãã©ã¯ã¿ã¯é
åã«æ§ã(X_Class_CALLING_SUPER)ãå¼ã³åºããã³ã³ã¹ãã©ã¯ã¿å
ã§ããã« Super ãå¼ã°ããå ´åãé
åãå
ã«ããã«ã¹ã¼ãã¼ãªã³ã³ã¹ãã©ã¯ã¿ã辿ãã¾ãã
* @example Constructor : function( arg1, arg2 ){
* this.Super( aeg1, arg2 );
@@ -132,58 +139,73 @@ X_Class_CommonMethods =
// TODO ç¾å¨ new ãã¦ããã¤ã³ã¹ã¿ã³ã¹ãä¿æãã¦ãã§ãã¯ãã
'Super' : function( var_args ){
var me = this,
- sClass = me,
- i = X_Class_CALLING_SUPER.indexOf( me ),
- l, sList, def, sConst, ret;
+ 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 ] = me;
- X_Class_CALL_SUPER_STACK[ l ] = sList = [];
- def = X_Class_getClassDef( me );
- if( !def.Constructor ) sClass = def.SuperClass;// ç¾å¨ã®ã¯ã©ã¹ãã³ã³ã¹ãã©ã¯ã¿ãæããªãå ´å SuperConstructor ã new ã§å¼ãã§ããããåã³å¼ã°ãªãããã«ãã
+ 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 ) break;
- if( sList.indexOf( sConst ) === -1 ){
- sList[ sList.length ] = sConst;
- ret = sConst.apply( me, arguments );
- --sList.length;
- if( !sList.length ){
- X_Class_CALLING_SUPER.splice( i, 1 );
- X_Class_CALL_SUPER_STACK.splice( i, 1 );
- };
- return ret || me;
+
+ 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 ã«ã¤ãã¦ã親ã¯ã©ã¹ã§è¨å®ããã¦ããååã®é¢æ°ã¡ã³ãã¼ãå¼ã³åºãã
- * 第ä¸å¼æ°ã«ãªã¼ãã¼ã©ã¤ãæ¸ã®èªèº«ã®(èªèº«ããåç
§ã§ãã)é¢æ°ãæå®ãã¾ããå
é¨ã§ã¯é¢æ°åã調ã¹ãä¸ã§ prototype ãã§ã¼ã³ãã´ãªã´ãªè¾¿ããç¹å¥ãªãã¨ã¯ãã¦ãã¾ããã
- * superCall ããã¹ãããå ´åãarguments.calleeãã§ãªãã¨æ£ããç¾å¨é層ãåå¾ãã¦è¦ªé¢æ°ãç¥ããã¨ãã§ããªã
- * 次ã®çç±ã«ãã£ã¦ãé¢æ°åã§è¾¿ããã¨ã¯ããã¾ãã
+ * myFunc ã«ã¤ãã¦ãã¹ã¼ãã¼ã¯ã©ã¹ã§è¨å®ããã¦ããååã®é¢æ°ãå¼ã³åºãã
+ * ä½éãªé¢æ°ãªã®ã§å¤ç¨ãããã¹ãã§ã¯ããã¾ããï¼
+ * 第ä¸å¼æ°ã«èªèº«ã®(èªèº«ããåç
§ã§ãã)é¢æ°ãæå®ãã¾ããå
é¨ã§ã¯é¢æ°åã調ã¹ãä¸ã§ prototype ãã§ã¼ã³ãã´ãªã´ãªè¾¿ããç¹å¥ãªãã¨ã¯ãã¦ãã¾ããã
+ * superCall 㨠Super ããã¹ãããå ´åãç¾å¨ã®ã¯ã©ã¹é層ã X_Class_SUPER_CALLER, X_Class_SUPER_STACKS ã使ã£ã¦æ§ãã¦ããã®ã§ãæå³ãã親é¢æ°ãå¼ã°ãã¾ãã
+ * 次ã®çç±ã«ãã£ã¦ãé¢æ°åã§è¾¿ããã¨ã¯éæ¨å¥¨ã§ãã
*
* - closur compiler ã§ã¡ã½ããåãå¤æ´ããã
- *
- superCall å
ããããã« superCall ãå¼ã°ããå ´åã«ãèµ·ç¹ã¨ãªãé¢æ°ãç¹å®ã§ããªã
*
- * 次ã®å ´åãæå³ããåä½ãå¾ããã¾ãã
+ * 次ã®å ´åãæå³ããåä½ãå¾ããã¾ããã
*
- * - 2ã¤ä»¥ä¸ã®ç°ãªãååã§åãé¢æ°ãã¡ã³ãã¼ãããå ´å
- * - ã¾ãã¯ããµãã¯ã©ã¹ã®ã¡ã³ãã¼ã«ã¹ã¼ãã¼ã¯ã©ã¹ã¨åãé¢æ°ãåºç¾ãã
- *
- superCall 以å¤ã®æ段ã§è¦ªé¢æ°ãå¼ã³ããã®ãªã㧠superCall ãèªãã
+ *
- 2ã¤ä»¥ä¸ã®ç°ãªãååã§åãé¢æ°ãã¡ã³ãã¼ãããå ´å
+ *
- ãµãã¯ã©ã¹ã® prototype ã«ã¹ã¼ãã¼ã¯ã©ã¹ã¨åãé¢æ°ãã³ãã¼ãã¦ãã
+ *
- éé¢æ°ã§ã¡ã³ãã¼ãä¸æ¸ããã¦ãã
+ *
- superCall 以å¤ã®æ段ã§è¦ªé¢æ°ãå¼ã³ããã®ãªã㧠superCall ãå¼ãã
*
- * é常㮠X.Class.create ã®æ¸ãæ¹ã§ã¯ãã®ãããªç¶æ³ã¯èµ·ãã¾ããããjs ã¯ãªãã§ãã§ããã®ã§
- * åè:ES5ãªJavascriptã§ã¢ãã³ãªã¯ã©ã¹çç¶æ¿ï¼ã¹ã¼ãã¼å¼ã³åºã
+ * é常㮠X.Class.create ã®æ¸ãæ¹ã§ã¯ãã®ãããªç¶æ³ã¯èµ·ãã¾ããããjs ã¯ãªãã§ãããããåºæ¥ã¦ãã¾ãã¾ãããâ¦
+ * åè:ES5ãªJavascriptã§ã¢ãã³ãªã¯ã©ã¹çç¶æ¿ï¼ã¹ã¼ãã¼å¼ã³åºã
+ * original:Classical Inheritance in JavaScript
* @param myFunc {Function|string} ãªã¼ãã¼ã©ã¤ãæ¸ã®èªèº«ã®(èªèº«ããåç
§ã§ãã)é¢æ°ã
* @param var_args {...*} ãªã¼ãã¼ã©ã¤ãå
é¢æ°ã«æ¸¡ãä»»æã®æ°ã®å¼æ°
- * @example return this.superCall( arguments.callee, param0, param1, ... );
+ * @example return this.superCall( this.myFunc, param0, param1, ... );
* @return {*} ãªã¼ãã¼ã©ã¤ãå
ã®é¢æ°ãå¼ã³åºããæ»ãå¤ã
*/
'superCall' : function( myFunc, var_args ){
@@ -191,9 +213,8 @@ X_Class_CommonMethods =
sClass = me.constructor,
proto = sClass.prototype,
i = X_Class_SUPER_CALLER.indexOf( me ),
- l, d, ret,
args = arguments,
- name, p, sFunc, hit;
+ p, name, stack, t, sFunc, ret;
if( X_Type_isFunction( myFunc ) ){
for( p in proto ){
@@ -203,72 +224,69 @@ X_Class_CommonMethods =
};
};
if( !name ) return;
+ } else
+ if( X_Type_isString( myFunc ) && X_Type_isFunction( me[ myFunc ] ) ){
+ name = myFunc;
} else {
return;
};
if( i === -1 ){
- X_Class_SUPER_CALLER[ l = X_Class_SUPER_CALLER.length ] = me;
- X_Class_SUPER_STACKS[ l ] = d = {};
+ X_Class_SUPER_CALLER[ i = X_Class_SUPER_CALLER.length ] = me;
+ t = stack = X_Class_SUPER_STACKS[ i ] = 0;
} else {
- d = X_Class_SUPER_STACKS[ i ];
- };
-
- if( stack = d[ name ] ){
- myFunc = stack[ stack.length - 1 ];
- } else {
- stack = d[ name ] = [];
+ t = stack = X_Class_SUPER_STACKS[ i ];
+
+ while( t ){
+ sClass = X_Class_getClassDef( sClass ).SuperClass;
+ --t;
+ };
};
- /*
- while( t ){
- sClass = X_Class_getClassDef( sClass ).SuperClass;
- --t;
- };
- mysFunc = sClass.prototype[ name ]; */
+ if( sClass ){
+ myFunc = sClass.prototype[ name ];
-
- // TODO
- while( sClass ){
- sFunc = sClass.prototype[ name ];
-
- if( !hit && sFunc === myFunc ){
- hit = true; // ç¾å¨ã®é¢æ°ã«ããã, ããã«ã¹ã¼ãã¼ã¯ã©ã¹ã辿ã£ã¦ååã®ããããã£ã®é¢æ°ãç¾ããããããç®æããã®
- } else
- if( hit && sFunc !== myFunc /* X_Object_own( name, sClass.prototype ) */ ){
- // this ã®é¢æ°ã¨ç°ãªããå¤ãè¨å®ããã¦ããããä»ã¯æãæã㦠undef ã?è¦ã¦ãããæ£ãã㯠hasOwnProperty
- if( X_Type_isFunction( sFunc ) ){
- stack[ stack.length ] = sFunc;
- switch( args.length ){
- case 0 :
- ret = sFunc.call( me );
- break;
- case 1 :
- ret = sFunc.call( me, args[ 0 ] );
- break;
- case 2 :
- ret = sFunc.call( me, args[ 0 ], args[ 1 ] );
- break;
- case 3 :
- ret = sFunc.call( me, args[ 0 ], args[ 1 ], args[ 2 ] );
- break;
- default :
- args = X_Array_copy( args );
- args.shift();
- ret = sFunc.apply( me, args );
- break;
+ while( sClass ){
+ ++t;
+ sClass = X_Class_getClassDef( sClass ).SuperClass;
+ sFunc = sClass.prototype[ name ];
+
+ if( sFunc !== myFunc /* X_Object_own( name, sClass.prototype ) */ ){
+ if( X_Type_isFunction( sFunc ) ){
+ X_Class_SUPER_STACKS[ i ] += t;
+ switch( args.length ){
+ case 1 :
+ ret = sFunc.call( me );
+ break;
+ case 2 :
+ ret = sFunc.call( me, args[ 1 ] );
+ break;
+ case 3 :
+ ret = sFunc.call( me, args[ 1 ], args[ 2 ] );
+ break;
+ case 4 :
+ ret = sFunc.call( me, args[ 1 ], args[ 2 ], args[ 3 ] );
+ break;
+ default :
+ args = X_Array_copy( args );
+ args.shift();
+ ret = sFunc.apply( me, args );
+ break;
+ };
};
- --stack.length;
+ break;
};
- break;
};
- sClass = X_Class_getClassDef( sClass ).SuperClass;
};
-
- if( !stack.length ) delete d[ name ];
- if( X_Object_isEmpty( d ) ){
- X_Class_SUPER_CALLER.splice( l, 1 );
- X_Class_SUPER_STACKS.splice( l, 1 );
+
+ // index ãæ¿ãã£ã¦ããå¯è½æ§ãããã®ã§åãç´ã
+ if( X_Class_SUPER_CALLER[ i ] !== me ) i = X_Class_SUPER_CALLER.indexOf( me );
+
+ 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;
},
@@ -295,7 +313,7 @@ X_Class_CommonMethods =
// --- interface ----------------------------------------------------------- //
// ------------------------------------------------------------------------- //
-/**
+/*
* @enum {number}
* @const
*/
@@ -335,6 +353,7 @@ X[ 'Class' ] = /** @lends X.Class */ {
*/
'NONE' : X_Class.NONE,
+ // TODO ãã®æå®ããã¬ã¼ã ã¯ã¼ã¯å
ã ãï¼
/**
* ã¤ã³ã¹ã¿ã³ã¹ã¯ç ´æ£æ(this.kill())ã«ååããã次åã® new MyClass() æã«åå©ç¨ããã¾ãã
* @const
@@ -610,8 +629,8 @@ function X_Class_inherits( /* displayName, classSetting, props */ ){
def = X_Class_getClassDef( klass );
// ç¶æ¿ç¨ããããã£ãæ§ãã
def.SuperClass = Super;
- def.SuperProto = Super.prototype;
- def.SuperConstructor = superDef.Constructor || superDef.SuperConstructor;
+ //def.SuperProto = Super.prototype;
+ //def.SuperConstructor = superDef.Constructor || superDef.SuperConstructor;
return klass;
};
@@ -645,8 +664,7 @@ function X_Class_actualConstructor( f, args ){
obj = def.Constructor ?
def.Constructor.apply( instance, args ) :
- def.SuperConstructor &&
- def.SuperConstructor.apply( instance, args );
+ def.SuperClass && instance[ 'Super' ].apply( instance, args );
if( obj !== instance && ( X_Type_isObject( obj ) || X_Type_isFunction( obj ) ) ){ // Class
instance[ 'kill' ]();