X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=0.6.x%2Fjs%2F01_core%2F13_XClass.js;h=dc1166b8c3a3c03e71644ed1cea7290709f64ec9;hb=35daae003b3b017a92d0c883f120bf3baf604fba;hp=bf86574923631465c6272bde1399de8a513e198c;hpb=427c4cbb7f8b1ee674b845ade0796fcbfee0fcba;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 bf86574..dc1166b 100644
--- a/0.6.x/js/01_core/13_XClass.js
+++ b/0.6.x/js/01_core/13_XClass.js
@@ -22,10 +22,13 @@ var
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 =
@@ -128,14 +131,15 @@ X_Class_CommonMethods =
*/
// TODO ç¾å¨ new ãã¦ããã¤ã³ã¹ã¿ã³ã¹ãä¿æãã¦ãã§ãã¯ãã
'Super' : function( var_args ){
- var sClass = this,
- i = X_Class_CALLING_SUPER.indexOf( sClass ),
+ var me = this,
+ sClass = me,
+ i = X_Class_CALLING_SUPER.indexOf( me ),
l, sList, def, sConst, ret;
if( i === -1 ){
- X_Class_CALLING_SUPER[ l = X_Class_CALLING_SUPER.length ] = sClass;
+ X_Class_CALLING_SUPER[ l = X_Class_CALLING_SUPER.length ] = me;
X_Class_CALL_SUPER_STACK[ l ] = sList = [];
- def = X_Class_getClassDef( sClass );
+ def = X_Class_getClassDef( me );
if( !def.Constructor ) sClass = def.SuperClass;// ç¾å¨ã®ã¯ã©ã¹ãã³ã³ã¹ãã©ã¯ã¿ãæããªãå ´å SuperConstructor ã new ã§å¼ãã§ããããåã³å¼ã°ãªãããã«ãã
} else {
sList = X_Class_CALL_SUPER_STACK[ i ];
@@ -148,13 +152,13 @@ X_Class_CommonMethods =
if( !sConst ) break;
if( sList.indexOf( sConst ) === -1 ){
sList[ sList.length ] = sConst;
- ret = sConst.apply( this, arguments );
+ 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;
+ return ret || me;
};
};
console.log( 'ã¹ã¼ãã¼ã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãè¦ã¤ããã¾ãã' );
@@ -162,20 +166,38 @@ X_Class_CommonMethods =
/**
* func ã«ã¤ãã¦ã親ã¯ã©ã¹ã§è¨å®ããã¦ããååã®é¢æ°ã¡ã³ãã¼ãå¼ã³åºãã
- * 第ä¸å¼æ°ã«é¢æ°ãæå®ãã2ã¤ä»¥ä¸ã®ç°ãªãååã§åãé¢æ°ãã¡ã³ãã¼ãããå ´åãåä½ãä¸ç¢ºå®ã«ãªãã¾ãã
+ * 第ä¸å¼æ°ã«ãªã¼ãã¼ã©ã¤ãæ¸ã®èªèº«ã®(èªèº«ããåç
§ã§ãã)é¢æ°ãæå®ãã¾ããå
é¨ã§ã¯é¢æ°åã調ã¹ãä¸ã§ prototype ãã§ã¼ã³ãã´ãªã´ãªè¾¿ããç¹å¥ãªãã¨ã¯ãã¦ãã¾ããã
+ * superCall ããã¹ãããå ´åãarguments.calleeãã§ãªãã¨æ£ããç¾å¨é層ãåå¾ãã¦è¦ªé¢æ°ãç¥ããã¨ãã§ããªã
+ * 次ã®çç±ã«ãã£ã¦ãé¢æ°åã§è¾¿ããã¨ã¯ããã¾ãã
+ *
+ * - closur compiler ã§ã¡ã½ããåãå¤æ´ããã
+ *
- superCall å
ããããã« superCall ãå¼ã°ããå ´åã«ãèµ·ç¹ã¨ãªãé¢æ°ãç¹å®ã§ããªã
+ *
+ * 次ã®å ´åãæå³ããåä½ãå¾ããã¾ãã
+ *
+ * - 2ã¤ä»¥ä¸ã®ç°ãªãååã§åãé¢æ°ãã¡ã³ãã¼ãããå ´å
+ * - ã¾ãã¯ããµãã¯ã©ã¹ã®ã¡ã³ãã¼ã«ã¹ã¼ãã¼ã¯ã©ã¹ã¨åãé¢æ°ãåºç¾ãã
+ *
- superCall 以å¤ã®æ段ã§è¦ªé¢æ°ãå¼ã³ããã®ãªã㧠superCall ãèªãã
+ *
+ * é常㮠X.Class.create ã®æ¸ãæ¹ã§ã¯ãã®ãããªç¶æ³ã¯èµ·ãã¾ããããjs ã¯ãªãã§ãã§ããã®ã§
* åè:ES5ãªJavascriptã§ã¢ãã³ãªã¯ã©ã¹çç¶æ¿ï¼ã¹ã¼ãã¼å¼ã³åºã
- * @param funcNameOrFunc {Function|string} ã¹ã¼ãã¼ã¯ã©ã¹ã®é¢æ°å ã¾ãã¯ããªã¼ãã¼ã©ã¤ãæ¸ã®èªèº«ã®é¢æ°ã
+ * @param myFunc {Function|string} ãªã¼ãã¼ã©ã¤ãæ¸ã®èªèº«ã®(èªèº«ããåç
§ã§ãã)é¢æ°ã
* @param var_args {...*} ãªã¼ãã¼ã©ã¤ãå
é¢æ°ã«æ¸¡ãä»»æã®æ°ã®å¼æ°
* @example return this.superCall( arguments.callee, param0, param1, ... );
* @return {*} ãªã¼ãã¼ã©ã¤ãå
ã®é¢æ°ãå¼ã³åºããæ»ãå¤ã
*/
- 'superCall' : function( funcNameOrFunc, var_args ){
- var sClass = this,
+ 'superCall' : function( myFunc, var_args ){
+ var me = this,
+ sClass = me.constructor,
+ proto = sClass.prototype,
+ i = X_Class_SUPER_CALLER.indexOf( me ),
+ l, d, ret,
args = arguments,
- name, p, sFunc, hit = false;
- if( X_Type_isFunction( funcNameOrFunc ) ){
- for( p in this.constructor.prototype ){
- if( this.constructor.prototype[ p ] === funcNameOrFunc ){
+ name, p, sFunc, hit;
+
+ if( X_Type_isFunction( myFunc ) ){
+ for( p in proto ){
+ if( proto[ p ] === myFunc ){
name = p;
break;
};
@@ -184,41 +206,76 @@ X_Class_CommonMethods =
} else {
return;
};
+
+ if( i === -1 ){
+ X_Class_SUPER_CALLER[ l = X_Class_SUPER_CALLER.length ] = me;
+ X_Class_SUPER_STACKS[ l ] = d = {};
+ } else {
+ d = X_Class_SUPER_STACKS[ i ];
+ };
- if( X_EMPTY_OBJECT[ name ] ) return;
-
+ if( stack = d[ name ] ){
+ myFunc = stack[ stack.length - 1 ];
+ } else {
+ stack = d[ name ] = [];
+ };
+
+ /*
+ while( t ){
+ sClass = X_Class_getClassDef( sClass ).SuperClass;
+ --t;
+ };
+ mysFunc = sClass.prototype[ name ]; */
+
+
+ // TODO
while( sClass ){
- def = X_Class_getClassDef( sClass );
- sClass = def.SuperClass;
- sFunc = sClass.prototype[ name ];
- if( sFunc === funcNameOrFunc ){
- hit = true; // ç¾å¨ã®é¢æ°ã«ããã
+ sFunc = sClass.prototype[ name ];
+
+ if( !hit && sFunc === myFunc ){
+ hit = true; // ç¾å¨ã®é¢æ°ã«ããã, ããã«ã¹ã¼ãã¼ã¯ã©ã¹ã辿ã£ã¦ååã®ããããã£ã®é¢æ°ãç¾ããããããç®æããã®
} else
- if( hit && X_Object_inObject( name, this ) ){
+ 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 :
- return sFunc.call( this );
+ ret = sFunc.call( me, args[ 0 ] );
+ break;
case 2 :
- return sFunc.call( this, args[ 1 ] );
+ ret = sFunc.call( me, args[ 0 ], args[ 1 ] );
+ break;
case 3 :
- return sFunc.call( this, args[ 1 ], args[ 2 ] );
- case 4 :
- return sFunc.call( this, args[ 1 ], args[ 2 ], args[ 3 ] );
+ ret = sFunc.call( me, args[ 0 ], args[ 1 ], args[ 2 ] );
+ break;
default :
args = X_Array_copy( args );
args.shift();
- return sFunc.apply( this, args );
+ ret = sFunc.apply( me, args );
+ break;
};
+ --stack.length;
};
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 );
};
+ return ret;
},
/**
* ã¤ã³ã¹ã¿ã³ã¹ã®ã¯ã©ã¹ãï¼ã¾ãã¯ã¹ã¼ãã¼ã¯ã©ã¹ãï¼èª¿ã¹ãã
- * instanceof æ§æããµãã¼ãããªãç°å¢(IE4,Mac IE5)ãæ³å®ããå ´åãå¿
ããã®ã¡ã½ããã使ç¨ãããã¨ã
+ * instanceof æ§æããµãã¼ãããªãç°å¢(IE5以ä¸)ãæ³å®ããå ´åãå¿
ããã®ã¡ã½ããã使ç¨ãããã¨ã
* ã¯ã©ã¹ã®ã¤ã³ã¹ã¿ã³ã¹ãï¼ã ã調ã¹ããå ´å㯠this.constructor === klass ãé«éã
* @param klass {__ClassBase__} ã¯ã©ã¹å®ç¾©
* @return {boolean}
@@ -429,16 +486,13 @@ X[ 'Class' ] = /** @lends X.Class */ {
function X_Class_getClass( instance ){
- var cList = X_Class_CLASS_LIST,
- i = cList.length,
- klass;
- for( ; i; ){
- klass = cList[ --i ];
- if( instance.constructor === klass ) return klass;
- };
+ var cList = X_Class_CLASS_LIST, i;
+
+ if( ( i = cList.indexOf( instance.constructor ) ) !== -1 ) return cList[ i ];
if( cList.indexOf( instance ) !== -1 ) return instance;
};
+// TODO def = klass( X_Closure_COMMAND_BACK )
function X_Class_getClassDef( KlassOrInstance ){
var i = X_Class_CLASS_LIST.indexOf( KlassOrInstance );
if( i === -1 ) i = X_Class_CLASS_LIST.indexOf( X_Class_getClass( KlassOrInstance ) );
@@ -584,7 +638,7 @@ function X_Class_actualConstructor( f, args ){
def.live && def.live.push( instance );
- if( ( X_UA[ 'AOSP' ] < 3 || X_UA[ 'iOS' ] < 5 ) && instance.constructor !== klass ){
+ if( X_Class_constructorFix && instance.constructor !== klass ){
console.log( '------- constructor ã®ä¸ä¸è´!' ); // Android2.3.7
instance.constructor = klass;
};