X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=0.6.x%2Fjs%2F01_core%2F13_XClass.js;h=61749575a131da3789531ec0a6c1a18be8f91f72;hb=ef25747bebf1799d49f9bd0d64e339da9ea61d13;hp=072bc2cd40be838a8969243cfaff2e9d76b9a4e2;hpb=54eba266c29baf743f6ac67942a2788cd697b12d;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 072bc2c..6174957 100644
--- a/0.6.x/js/01_core/13_XClass.js
+++ b/0.6.x/js/01_core/13_XClass.js
@@ -15,7 +15,7 @@ var
* ã¯ã©ã¹å
* @type {string}
*/
- name : ''
+ NAME : ''
},
X_Class_CLASS_LIST = [],
@@ -25,7 +25,10 @@ var
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_use_proto_ = !X_UA[ 'OperaMobile' ] && !X_UA[ 'OperaTablet' ] &&
+ // Android ã§åå ä¸æã®ã¨ã©ã¼ã«ééãã¦ããã®ã¯ããã®è¾ºããæªãã... 2016.3.9
+ !X_UA[ 'AOSP' ] && !X_UA[ 'ChromeWV' ] &&
+ !!X_emptyFunction.prototype.__proto__,
X_Class_constructorFix = X_UA[ 'AOSP' ] < 3 || X_UA[ 'iOS' ] < 5,
X_Class_SEAL_KILLING = [],
@@ -36,14 +39,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
@@ -57,7 +60,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 );
@@ -67,7 +70,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;
};
@@ -79,17 +82,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 ) ){
@@ -119,7 +131,7 @@ X_Class_CommonMethods =
},
/**
- * é¢æ°ã¯ Constructor å
ã§ä½¿ç¨ãã¾ããã¯ã©ã¹å®ç¾©ã辿ã£ã¦ã¹ã¼ãã¼ã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãæ¢ãã¾ãã
+ * é¢æ°ã¯ Constructor å
ã§ä½¿ç¨ãã¾ããã¯ã©ã¹å®ç¾©ã辿ã£ã¦ã¹ã¼ãã¼ã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãå¼ã³åºãã¾ãã
* å
é¨çã«ã¯ãå¼ã³åºããã³ã³ã¹ãã©ã¯ã¿ã¯é
åã«æ§ã(X_Class_CALLING_SUPER)ãå¼ã³åºããã³ã³ã¹ãã©ã¯ã¿å
ã§ããã« Super ãå¼ã°ããå ´åãé
åãå
ã«ããã«ã¹ã¼ãã¼ãªã³ã³ã¹ãã©ã¯ã¿ã辿ãã¾ãã
* @example Constructor : function( arg1, arg2 ){
* this.Super( aeg1, arg2 );
@@ -130,24 +142,22 @@ X_Class_CommonMethods =
// TODO ç¾å¨ new ãã¦ããã¤ã³ã¹ã¿ã³ã¹ãä¿æãã¦ãã§ãã¯ãã
'Super' : function( var_args ){
var me = this,
- sClass = me,
+ sClass = me.constructor,
i = X_Class_SUPER_CALLER.indexOf( me ),
stack, t, def, ret;
if( i === -1 ){
X_Class_SUPER_CALLER[ i = X_Class_SUPER_CALLER.length ] = me;
- X_Class_SUPER_STACKS[ i ] = stack = 0;
+ t = stack = X_Class_SUPER_STACKS[ i ] = 0;
} else {
- stack = X_Class_SUPER_STACKS[ i ];
+ t = stack = X_Class_SUPER_STACKS[ i ];
+
+ while( t ){
+ sClass = X_Class_getClassDef( sClass ).SuperClass;
+ --t;
+ };
};
-
- t = stack;
-
- while( t ){
- sClass = X_Class_getClassDef( sClass ).SuperClass;
- --t;
- };
-
+
while( sClass ){
++t;
sClass = X_Class_getClassDef( sClass ).SuperClass;
@@ -161,7 +171,12 @@ X_Class_CommonMethods =
};
};
- if( X_Class_SUPER_STACKS[ i ] === stack ) 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 );
@@ -173,25 +188,27 @@ X_Class_CommonMethods =
},
/**
- * 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 ){
@@ -199,9 +216,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;
+ p, name, stack, t, sFunc, ret;
if( X_Type_isFunction( myFunc ) ){
for( p in proto ){
@@ -211,24 +227,25 @@ 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[ i = X_Class_SUPER_CALLER.length ] = me;
- X_Class_SUPER_STACKS[ i ] = stack = 0;
+ t = stack = X_Class_SUPER_STACKS[ i ] = 0;
} else {
- stack = X_Class_SUPER_STACKS[ i ];
+ t = stack = X_Class_SUPER_STACKS[ i ];
+
+ while( t ){
+ sClass = X_Class_getClassDef( sClass ).SuperClass;
+ --t;
+ };
};
- t = stack;
-
- while( t ){
- sClass = X_Class_getClassDef( sClass ).SuperClass;
- --t;
- };
-
if( sClass ){
myFunc = sClass.prototype[ name ];
@@ -238,21 +255,20 @@ X_Class_CommonMethods =
sFunc = sClass.prototype[ name ];
if( sFunc !== myFunc /* X_Object_own( name, sClass.prototype ) */ ){
- // this ã®é¢æ°ã¨ç°ãªããå¤ãè¨å®ããã¦ããããä»ã¯æãæã㦠undef ã?è¦ã¦ãããæ£ãã㯠hasOwnProperty
if( X_Type_isFunction( sFunc ) ){
X_Class_SUPER_STACKS[ i ] += t;
switch( args.length ){
- case 0 :
- ret = sFunc.call( me );
- break;
case 1 :
- ret = sFunc.call( me, args[ 0 ] );
+ ret = sFunc.call( me );
break;
case 2 :
- ret = sFunc.call( me, args[ 0 ], args[ 1 ] );
+ ret = sFunc.call( me, args[ 1 ] );
break;
case 3 :
- ret = sFunc.call( me, args[ 0 ], args[ 1 ], args[ 2 ] );
+ 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 );
@@ -266,6 +282,9 @@ X_Class_CommonMethods =
};
};
+ // 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 );
@@ -285,6 +304,7 @@ X_Class_CommonMethods =
// TODO instanceof ã«å¯¾å¿ãããã©ã¦ã¶ã¯ãã¡ãã使ç¨
'instanceOf' : function( klass ){
var Super = this;
+
if( this.constructor === klass ) return true;
while( Super = X_Class_getClassDef( Super ).SuperClass ){
if( Super === klass ) return true;
@@ -297,7 +317,7 @@ X_Class_CommonMethods =
// --- interface ----------------------------------------------------------- //
// ------------------------------------------------------------------------- //
-/**
+/*
* @enum {number}
* @const
*/
@@ -337,6 +357,7 @@ X[ 'Class' ] = /** @lends X.Class */ {
*/
'NONE' : X_Class.NONE,
+ // TODO ãã®æå®ããã¬ã¼ã ã¯ã¼ã¯å
ã ãï¼
/**
* ã¤ã³ã¹ã¿ã³ã¹ã¯ç ´æ£æ(this.kill())ã«ååããã次åã® new MyClass() æã«åå©ç¨ããã¾ãã
* @const
@@ -464,7 +485,7 @@ X[ 'Class' ] = /** @lends X.Class */ {
klass.prototype.constructor = klass;
};
- klass[ 'name' ] = displayName;
+ klass[ 'NAME' ] = displayName;
if( opt_abstract ){
classDef.isAbstract = true;
@@ -647,7 +668,7 @@ function X_Class_actualConstructor( f, args ){
obj = def.Constructor ?
def.Constructor.apply( instance, args ) :
- instance[ 'Super' ].apply( instance, args );
+ def.SuperClass && instance[ 'Super' ].apply( instance, args );
if( obj !== instance && ( X_Type_isObject( obj ) || X_Type_isFunction( obj ) ) ){ // Class
instance[ 'kill' ]();