X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;ds=inline;f=0.6.x%2Fjs%2F01_core%2F11_XClass.js;h=e4b556aa53ab1eed7c551f6b0e88eaf7c0dd692f;hb=8e74cf066ea48ec8cf34efb2b5e84725c10c813a;hp=1a5499e02cad620eac0cd0a7be06e61f6348b60f;hpb=50462b7b22a3c42bdbf2fb84d782937f817368f4;p=pettanr%2FclientJs.git
diff --git a/0.6.x/js/01_core/11_XClass.js b/0.6.x/js/01_core/11_XClass.js
index 1a5499e..e4b556a 100644
--- a/0.6.x/js/01_core/11_XClass.js
+++ b/0.6.x/js/01_core/11_XClass.js
@@ -5,7 +5,7 @@
var
/**
* å
¨ã¦ã®ã¯ã©ã¹ã®ã¹ã¼ãã¼ã¯ã©ã¹ã®ãããªãã®ã(ã©ã¤ãã©ãªå
ã«ã«ãã»ã«åããã¦ãããããã¦ã¼ã¶ã触ããã¨ã¯ããã¾ãã)
- * X_Class.create() ã§å®ç¾©ãããã¯ã©ã¹ã®ã¤ã³ã¹ã¿ã³ã¹ãå
±éã§åããã¡ã½ãã ã確èªãã¦ãã ããã
+ * X.Class.create() ã§å®ç¾©ãããã¯ã©ã¹ã®ã¤ã³ã¹ã¿ã³ã¹ãå
±éã§åããã¡ã½ãã ã確èªãã¦ãã ããã
* @class __ClassBase__
* @private
* @abstract
@@ -20,11 +20,8 @@ var
X_Class_CLASS_LIST = [],
X_Class_DEF_LIST = [],
- X_Class_PRIVATE_CLASS_LIST = [],
- X_Class_PRIVATE_DEF_LIST = [],
X_Class_CALLING_SUPER = [],
X_Class_CALL_SUPER_STACK = [],
- X_Class_killPrivateFlag = false,
X_Class_traits = null,
X_Class_useObjectCreate = false, // !!Object.create, http://jsperf.com/prototype-vs-object-create-perf
X_Class_use_proto_ = !X_UA[ 'OperaMobile' ] && !X_UA[ 'OperaTablet' ] && !!X_emptyFunction.prototype.__proto__,
@@ -37,70 +34,50 @@ X_Class_CommonMethods =
* å
¨ã¦ã®åçã¡ã³ããåé¤ãã¦ãã¤ã³ã¹ã¿ã³ã¹ãç ´æ£ããã
* ã¤ã³ã¹ã¿ã³ã¹ã X.EventDispatcher ã¨ãã®ãµãã¯ã©ã¹ã®å ´åã次ã®åä½ãããã
*
- * - X.Event.BEFORE_KILL_INSTANCE ãçºç«ãããæ»ãå¤ã®ããããã©ã°ã« X_Callback_PREVENT_DEFAULT ãç«ã¤å ´åãç ´æ£ããã£ã³ã»ã«ã X.Event.KILL_INSTANCE_CANCELED ãçºç«ããã
+ *
- X.Event.BEFORE_KILL_INSTANCE ãçºç«ãããæ»ãå¤ã®ããããã©ã°ã« X_Callback.PREVENT_DEFAULT ãç«ã¤å ´åãç ´æ£ããã£ã³ã»ã«ã X.Event.KILL_INSTANCE_CANCELED ãçºç«ããã
*
- ç ´æ£ã«é²ãå ´åã¯ãX.Event.KILL_INSTANCE ãçºç«ããã
*
- dispatch ä¸ã¯ãã¤ã³ã¹ã¿ã³ã¹ã®å
¨ã¦ã® dispatch ãçµäºããã¾ã§å®éã®ç ´æ£ãå¾
ã¤ã
*
- å®éã®ç ´æ£ã§ã¯ãã¤ã³ã¹ã¿ã³ã¹ã®ã¡ã³ãã®åé¤ã«å ãã¦å
¨ã¦ã®ã¤ãã³ããªã¹ãã解é¤ããã
*/
// TODO kill ããã¤ã³ã¹ã¿ã³ã¹ã®ã¤ãã³ããæ®ã£ã¦ããªããï¼ããã¯éçºç¨ã®ã¿
'kill' : function(){
- var instance = this,
- klass = X_Class_getClass( instance ),
- def = X_Class_getClassDef( klass ),
- data, p, i;
- if( def.isPrivate && !X_Class_killPrivateFlag && ( !this[ '_listeners' ] || !this[ '_listeners' ][ X_Listeners_.KILL_RESERVED ] ) ){
- X.Logger.critical( 'PrivateInstance.kill() work in PrivateUser.kill().' );
- return;
- };
- X_Class_killPrivateFlag = false; // instance.kill() å
㧠PrivateInstance.kill() ãé²ããã
+ var def, listeners, p;
+
+ // TODO kill ä¸ã® kill ã®å¼ã³åºããé²ã, ç ´æ£æ¸ã®ã¤ã³ã¹ã¿ã³ã¹ã¸ã® kill
if( this[ 'instanceOf' ]( X_EventDispatcher ) ){
- if( !def.isPrivate ){
- if( this[ 'dispatch' ]( X_EVENT_BEFORE_KILL_INSTANCE ) & X_Callback_PREVENT_DEFAULT ){
- this[ 'dispatch' ]( X_EVENT_KILL_INSTANCE_CANCELED );
- return;
- };
- if( this[ '_listeners' ] && this[ '_listeners' ][ X_Listeners_.DISPATCHING ] ){
- this[ '_listeners' ][ X_Listeners_.KILL_RESERVED ] = true;
- return;
- };
- } else {
- this[ 'dispatch' ]( X_EVENT_BEFORE_KILL_INSTANCE );
+
+ if( this[ 'dispatch' ]( X_EVENT_BEFORE_KILL_INSTANCE ) & X_Callback_PREVENT_DEFAULT ){
+ this[ 'dispatch' ]( X_EVENT_KILL_INSTANCE_CANCELED );
+ return;
+ };
+
+ listeners = this[ '_listeners' ];
+
+ if( listeners && listeners[ X_LISTENERS_DISPATCHING ] ){
+ listeners[ X_LISTENERS_KILL_RESERVED ] = true;
+ return;
};
// asyncDispatch ã®åé¤
for( p in X_EventDispatcher_LAZY_TIMERS ){
if( X_EventDispatcher_LAZY_TIMERS[ p ] === this ){
- delete X_EventDispatcher_LAZY_TIMERS[ p ]; // åé¤ãå
ï¼çç±ã¯ X.Timer.removeã確èªã
- X_Timer_remove( parseFloat( p ) );
+ // delete X_EventDispatcher_LAZY_TIMERS[ p ];ãã³ã¬ä¸è¦
+ X_Timer_remove( p );
};
};
this[ 'dispatch' ]( X_EVENT_KILL_INSTANCE );
- this[ '_listeners' ] && X_EventDispatcher_unlistenAll( this );
+ listeners && X_EventDispatcher_unlistenAll( this );
};
- for( p in instance ){
- if( instance.hasOwnProperty && !instance.hasOwnProperty( p ) ) continue;
- delete instance[ p ];
- };
+ X_Object_clear( this );
+
+ def = X_Class_getClassDef( this );
+
if( def.pool ){
- def.live && def.live.splice( def.live.indexOf( instance ), 1 );
- def.pool[ def.pool.length ] = instance;
- };
- if( def.privateClass ){
- i = def.userList.indexOf( instance );
- if( i !== -1 ){
- data = X_Class_getPrivate( instance );
- if( data[ '_listeners' ] && data[ '_listeners' ][ X_Listeners_.DISPATCHING ] && data[ 'instanceOf' ]( X.EventDispatcher ) ){
- data[ '_listeners' ][ X_Listeners_.KILL_RESERVED ] = true;
- } else {
- X_Class_killPrivateFlag = true;
- data[ 'kill' ]();
- };
- def.dataList.splice( i, 1 );
- def.userList.splice( i, 1 );
- };
+ def.live.splice( def.live.indexOf( this ), 1 );
+ def.pool[ def.pool.length ] = this;
};
},
@@ -232,9 +209,7 @@ var X_Class = {
POOL_OBJECT : 1,
ABSTRACT : 2,
FINAL : 4,
- SUPER_ACCESS : 8,
- PRIVATE_DATA : 16,
- SINGLETON : 32
+ SINGLETON : 8
};
/**
@@ -248,7 +223,7 @@ var X_Class = {
*
*
*
- * - X_Class.create( opt_settings, opt_name, opt_privateClass, opt_props ) ã§ã¯ã©ã¹ãç»é²ï¼
+ *
- X.Class.create( opt_settings, opt_name, opt_props ) ã§ã¯ã©ã¹ãç»é²ï¼
*
- ã³ã³ã¹ãã©ã¯ã¿ ã¨ãªãã¡ã½ããã¯ãopt_props å
ã® Constructor : function( arg ){ ... }, ã«æ¸ãï¼
*
- é常éã new 㧠ã¤ã³ã¹ã¿ã³ã¹çæ
*
- kill() ã§ãªãã¸ã§ã¯ããã¯ãªã¼ã³ãã¦åé¤ãpool ãæå¹ã®å ´å㯠pool ãããï¼
@@ -257,7 +232,7 @@ var X_Class = {
* @namespace X.Class
* @alias X.Class
*/
-X[ 'Class' ] = {
+X[ 'Class' ] = /** @lends X.Class */ {
/**
* è¨å®ãªãã
@@ -284,32 +259,14 @@ X[ 'Class' ] = {
'FINAL' : X_Class.FINAL,
/**
- * 使ç¨ãä¸æ¢ãpetanR ã©ã¤ãã©ãªä½¿ç¨ããã¸ã§ã¯ããã SUPER_ACCESS ãæ¶ããããããåé¤ã
- * @const
- */
- 'SUPER_ACCESS' : X_Class.SUPER_ACCESS,
-
- /**
- * å
é¨ã³ã¼ãã主㫠X.UI ãã¬ã¼ã ã¯ã¼ã¯ã«å¯¾ãã¦ããã¬ã¼ã å¤ã«é²åºããã¤ã³ã¹ã¿ã³ã¹ã¨ãã¢ã§åä½ãããã·ã£ãã¦ãªã¤ã³ã¹ã¿ã³ã¹ã®ä½¿ç¨ã宣è¨ããã
- * Javascript ã¯ã¤ã³ã¹ã¿ã³ã¹æ¯ã®ã«ãã»ã«åãã¨ã¦ãã³ã¹ãé«ãå¾®å¦ãªã³ã¹ãå¢ã§é è½ãããã¤ã³ã¹ã¿ã³ã¹ã使ãã
- * @const
- */
- 'PRIVATE_DATA' : X_Class.PRIVATE_DATA,
-
- /**
* æªå®è£
ãã§ãç®å°ã«ãªãã®ã§ä»ãã¦ããã¾ãããã
* @const
*/
'SINGLETON' : X_Class.SINGLETON,
- 'create' : X_Class_create,
+ 'create' : X_Class_create
// TODO collect
-
- '_newPrivate' : X_Class_newPrivate,
-
- '_getPrivate' : X_Class_getPrivate
-
};
@@ -319,23 +276,40 @@ X[ 'Class' ] = {
// ------------------------------------------------------------------------- //
/**
* ã¯ã©ã¹ãå®ç¾©ããã
- * X_Class.create() ã«ããã¯ã©ã¹å®ç¾©ã¯å¿
ãããã³ã³ã¹ãã©ã¯ã¿ãå¿
è¦ã¨ãã¾ãããã¯ã©ã¹å®ç¾©æã«ã³ã³ã¹ãã©ã¯ã¿ãæªè¨å®ã®å ´åãã¹ã¼ãã¼ã¯ã©ã¹ãããã°ãã®ã³ã³ã¹ãã©ã¯ã¿ã使ç¨ãã¾ãã
- * @alias X_Class.create
+ * X.Class.create() ã«ããã¯ã©ã¹å®ç¾©ã¯å¿
ãããã³ã³ã¹ãã©ã¯ã¿('Constructor')ãå¿
è¦ã¨ãã¾ãããã¯ã©ã¹å®ç¾©æã«ã³ã³ã¹ãã©ã¯ã¿ãæªè¨å®ã®å ´åãã¹ã¼ãã¼ã¯ã©ã¹ãããã°ãã®ã³ã³ã¹ãã©ã¯ã¿ã使ç¨ãã¾ãã
+ * @alias X.Class.create
* @param {string} [displayName] ã¯ã©ã¹ã®åå
* @param {number} [classSetting=0] X_Class.POOL_OBJECT | X_Class.FINAL ãªã©
- * @param {__ClassBase__=} [privateClass] ãã®ã¯ã©ã¹ã¨ãã¢ã§åä½ããã·ã£ãã¦ã¯ã©ã¹
* @param {object} [props={}] ãã®ã¯ã©ã¹ã®ã¡ã³ãã¨é¢æ°ãã³ã³ã¹ãã©ã¯ã¿ã¯ Constructor ã¨æ¸ããã¨
* @return {__ClassBase__}
+ * @example var myClass = X.Class.create(
+ * 'myClass',
+ * X.Class.FINAL,
+ * {
+ * name : '',
+ * Constructor : function( obj ){
+ * this.name = obj.name;
+ * },
+ * getName : function(){
+ * return this.name;
+ * },
+ * setName : function(v){
+ * this.name = v;
+ * }
+ * }
+ * );
*/
function X_Class_create( /* displayName, classSetting, privateClass, props */ ){
var args = X_Object_cloneArray( arguments ),
displayName = args[ 0 ],
classSetting,
- opt_pool, opt_abstract, opt_final, opt_private,
+ opt_pool, opt_abstract, opt_final,
privateDef,
props,
klass,
- classDef = {}, hash;
+ classDef = {},
+ cbHash = { proxy : X_Class_actualConstructor, classDef : classDef };
+
if( X_Type_isString( displayName ) === true ){
classDef.displayName = displayName;
args.shift();
@@ -347,7 +321,6 @@ X[ 'Class' ] = {
opt_pool = !!( classSetting & X_Class.POOL_OBJECT );
opt_abstract = !!( classSetting & X_Class.ABSTRACT );
opt_final = !!( classSetting & X_Class.FINAL );
- opt_private = !!( classSetting & X_Class.PRIVATE_DATA );
if( opt_final && opt_abstract ){
X.Logger.critical( 'final & Abstract!' );
return;
@@ -357,32 +330,24 @@ X[ 'Class' ] = {
classDef.setting = 0;
};
- // ã·ã£ãã¦ã¯ã©ã¹
- if( X_Class_PRIVATE_CLASS_LIST.indexOf( args[ 0 ] ) !== -1 ){
- privateDef = X_Class_getClassDef( args[ 0 ] );
- if( privateDef.isPrivate !== true ){
- X.Logger.critical( 'PrivateClass not found! please, X_Class.create( X_Class.PRIVATE, {...} ).' );
- return;
- } else
- if( privateDef.Abstract === true ){
- X.Logger.critical( 'PrivateClass is Abstract!' );
- return;
- };
- classDef.privateClass = args.shift();
- };
-
// ã¤ã³ã¹ã¿ã³ã¹ã®ã¡ã³ãã¼
props = args[ 0 ];
if( !X_Type_isObject( props ) ){
// ã¯ã©ã¹ã¡ã³ãç¨ãªãã¸ã§ã¯ããç¡ãã§ãã¯ã©ã¹ã¯ä½æå¯è½
props = {};
} else
- if( props[ 'Constructor' ] && X_Type_isFunction( props[ 'Constructor' ] ) ){
+ if( props[ 'Constructor' ] ){
+ //{+dev
+ if( !X_Type_isFunction( props[ 'Constructor' ] ) ){
+ alert( '"Constructor" is not function.' );
+ return;
+ };
+ //}+dev
classDef.Constructor = props[ 'Constructor' ];
};
- klass = X_Callback_actualClosure( hash = { proxy : X_Class_actualConstructor } ); // TODO hash = classDef
- hash.klass = klass;
+ klass = X_Callback_actualClosure( cbHash ); // TODO callbackHash ã classå®ç¾©ã®ç½®ãå ´æã«ãã¦ãã¾ãï¼ãªãã»ã©â¦
+ cbHash.klass = klass;
klass[ 'superClassOf' ] = X_Class_superClassOf;
klass[ 'subClassOf' ] = X_Class_subClassOf;
@@ -409,25 +374,17 @@ X[ 'Class' ] = {
} else
if( opt_pool ){
classDef.pool = [];
- if( opt_private === false ) classDef.live = [];
+ classDef.live = [];
};
if( opt_final ){
classDef.Final = true;
} else {
klass[ 'inherits' ] = X_Class_inherits;
};
- if( opt_private ){
- if( classDef.privateClass ){
- X.Logger.critical( 'Private Data Class has no PrivateClass!' );
- return;
- };
- classDef.isPrivate = true;
- X_Class_PRIVATE_CLASS_LIST.push( klass );
- X_Class_PRIVATE_DEF_LIST.push( classDef );
- } else {
- X_Class_CLASS_LIST.push( klass );
- X_Class_DEF_LIST.push( classDef );
- };
+
+ X_Class_CLASS_LIST.push( klass );
+ X_Class_DEF_LIST.push( classDef );
+
return klass;
};
@@ -441,15 +398,7 @@ function X_Class_getClass( instance ){
klass = cList[ --i ];
if( instance.constructor === klass ) return klass;
};
- cList = X_Class_PRIVATE_CLASS_LIST;
- i = cList.length;
- for( ; i; ){
- klass = cList[ --i ];
- if( instance.constructor === klass ) return klass;
- };
-
if( cList.indexOf( instance ) !== -1 ) return instance;
- if( X_Class_CLASS_LIST.indexOf( instance ) !== -1 ) return instance;
};
function X_Class_getClassDef( KlassOrInstance ){
@@ -457,43 +406,7 @@ function X_Class_getClassDef( KlassOrInstance ){
if( i === -1 ) i = X_Class_CLASS_LIST.indexOf( X_Class_getClass( KlassOrInstance ) );
if( i !== -1 ) return X_Class_DEF_LIST[ i ];
- i = X_Class_PRIVATE_CLASS_LIST.indexOf( KlassOrInstance );
- if( i === -1 ) i = X_Class_PRIVATE_CLASS_LIST.indexOf( X_Class_getClass( KlassOrInstance ) );
- if( i !== -1 ) return X_Class_PRIVATE_DEF_LIST[ i ];
-
if( X_Class_DEF_LIST.indexOf( KlassOrInstance ) !== -1 ) return KlassOrInstance;
- if( X_Class_PRIVATE_DEF_LIST.indexOf( KlassOrInstance ) !== -1 ) return KlassOrInstance;
-};
-
-function X_Class_newPrivate( /* instance, args */ ){
- var args = X_Object_cloneArray( arguments ),
- user = args.shift(),
- def = X_Class_getClassDef( user ),
- privateClass = def.privateClass,
- privateDef = X_Class_getClassDef( privateClass ),
- i = -1;
- if( def.userList ){
- i = def.userList.indexOf( user );
- } else {
- def.userList = [];
- def.dataList = [];
- };
- if( i !== -1 ){
- X.Logger.critical( 'PrivateData already exist!' );
- return;
- };
- if( privateDef._tempUser ){
- X.Logger.critical( 'newPrivate ãé£ç¶å¼ã³åºããããã¨ããç ´ç¶»' );
- return;
- };
- privateDef._tempUser = user;
- return X_Class_actualConstructor( privateClass( X_Closure_COMMAND_BACK ), args );// privateClass.__new( args );
-};
-
-function X_Class_getPrivate( instance ){
- var def = X_Class_getClassDef( instance ),
- i = def.userList.indexOf( instance );
- if( i !== -1 ) return def.dataList[ i ];
};
/* over ã®ããããã£ã target ã«ã³ãã¼ããï¼ãã ã target ã® ããããã£ãåªå
, force ã§è§£é¤ */
@@ -580,16 +493,12 @@ function X_Class_inherits( /* displayName, classSetting, opt_PrivateClass, props
// ã¯ã©ã¹è¨å®ããªãå ´åã親ããã³ãã¼ãã¦ãAbstract flag ã¯è½ã¨ã??
classSetting = superDef.setting;// &= ~X_Class.ABSTRACT;
};
- if( superDef.isPrivate ) classSetting = classSetting | X_Class.PRIVATE_DATA;
params.push( classSetting );
// ãµãã¯ã©ã¹ã®ã·ã£ãã¦
if( args[ 0 ] && X_Class_getClass( args[ 0 ] ) ){
params.push( args.shift() );
- } else
- if( superDef.privateClass ){
- params.push( superDef.privateClass );
};
/* props æªå®ç¾©ã§ãå¯ */
@@ -622,40 +531,28 @@ function X_Class_inherits( /* displayName, classSetting, opt_PrivateClass, props
*/
function X_Class_actualConstructor( f, args ){
var klass = f.klass,
- def = X_Class_getClassDef( klass ),
- dataUser = def._tempUser,
- instance, obj,
- userDef;
+ def = f.classDef,
+ instance, obj;
+
if( def.Abstract ){
X.Logger.critical( 'AbstractClass!' );
return;
};
- if( def.isPrivate && !dataUser ){
- X.Logger.critical( 'use myClass.newPrivate( instance, ...args )!' );
- return;
- };
- instance = def.pool && def.pool.length > 0 ?
+ instance = def.pool && def.pool.length ?
def.pool.pop() :
X_Class_useObjectCreate ?
Object.create( klass.prototype ) :
new klass( X_Closure_COMMAND_DROP );
- if( def.isPrivate ){
- userDef = X_Class_getClassDef( dataUser );
- userDef.dataList.push( instance );
- userDef.userList.push( dataUser );
- instance.User = dataUser;
- def._tempUser = null;
- } else {
- def.live && def.live.push( instance );
- };
+ def.live && def.live.push( instance );
obj = def.Constructor ?
def.Constructor.apply( instance, args ) :
def.SuperConstructor &&
def.SuperConstructor.apply( instance, args );
- if( ( X_Type_isObject( obj ) && obj !== instance ) || X_Type_isFunction( obj ) ){ // Class
+
+ if( obj !== instance && ( X_Type_isObject( obj ) || X_Type_isFunction( obj ) ) ){ // Class
instance[ 'kill' ]();
return obj;
};