X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=0.6.x%2Fjs%2F01_core%2F11_XClass.js;h=e4b556aa53ab1eed7c551f6b0e88eaf7c0dd692f;hb=8e74cf066ea48ec8cf34efb2b5e84725c10c813a;hp=5222ea86afed10b2f55c1b3da25a04cdd3fecc57;hpb=57e35f063b4a70fcec59db6ec7366b43f41f0ba4;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 5222ea8..e4b556a 100644
--- a/0.6.x/js/01_core/11_XClass.js
+++ b/0.6.x/js/01_core/11_XClass.js
@@ -1,105 +1,192 @@
-/**
- * Class ãå®ç¾©ã ã·ã¹ãã ã®ç®¡çä¸ã«ç½®ãï¼
- * å
¨ã¦ã®ã¯ã©ã¹ã¨ pool ãæå¹ã®å ´åã¤ã³ã¹ã¿ã³ã¹ã¸ã®åç
§ãä¿æãããï¼
- * 1. X.Class.create( opt_settings, opt_name, opt_privateClass, opt_props ) ã§ã¯ã©ã¹ãç»é²ï¼
- * 2. ã³ã³ã¹ãã©ã¯ã¿ ã¨ãªãã¡ã½ããã¯ãopt_props å
ã® Constructor : function( arg ){ ... }, ã«æ¸ãï¼
- * 3. é常éã new 㧠ã¤ã³ã¹ã¿ã³ã¹çæ
- * 4. kill() ã§ãªãã¸ã§ã¯ããã¯ãªã¼ã³ãã¦åé¤ãpool ãæå¹ã®å ´å㯠pool ãããï¼
- * 5. pool ãæå¹ã®å ´åãnew 㧠pool ãããã¤ã³ã¹ã¿ã³ã¹ãè¿ãããï¼
- * 6.
- *
- */
// ------------------------------------------------------------------------- //
// ------------ local variables -------------------------------------------- //
// ------------------------------------------------------------------------- //
-var X_Class_CLASS_LIST = [],
+var
+ /**
+ * å
¨ã¦ã®ã¯ã©ã¹ã®ã¹ã¼ãã¼ã¯ã©ã¹ã®ãããªãã®ã(ã©ã¤ãã©ãªå
ã«ã«ãã»ã«åããã¦ãããããã¦ã¼ã¶ã触ããã¨ã¯ããã¾ãã)
+ * X.Class.create() ã§å®ç¾©ãããã¯ã©ã¹ã®ã¤ã³ã¹ã¿ã³ã¹ãå
±éã§åããã¡ã½ãã ã確èªãã¦ãã ããã
+ * @class __ClassBase__
+ * @private
+ * @abstract
+ */
+ __ClassBase__ = {
+ /**
+ * ã¯ã©ã¹å
+ * @type {string}
+ */
+ name : ''
+ },
+
+ 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.emptyFunction.prototype.__proto__,
-
-/**
- * X.Class.create ã§å®ç¾©ãããã¯ã©ã¹ã®ã¤ã³ã¹ã¿ã³ã¹ãå
±éã§åããã¡ã½ãã ãæ ¼ç´
- *
- * @class
- */
-X_Class_CommonProps =
+ X_Class_use_proto_ = !X_UA[ 'OperaMobile' ] && !X_UA[ 'OperaTablet' ] && !!X_emptyFunction.prototype.__proto__,
+ // Opera Mobile 12.10 Android11 IS01 ã§ã¯ã©ã¹ã®ã¡ã³ããæ¬ è½ããåé¡ã«ééã__proto__ ã使ããªãã¨åä½,,,
+X_Class_CommonMethods =
+/** @lends __ClassBase__.prototype */
{
- /*
- * ã¤ã³ã¹ã¿ã³ã¹ã®ç ´æ£ã
+ /**
+ * å
¨ã¦ã®åçã¡ã³ããåé¤ãã¦ãã¤ã³ã¹ã¿ã³ã¹ãç ´æ£ããã
+ * ã¤ã³ã¹ã¿ã³ã¹ã X.EventDispatcher ã¨ãã®ãµãã¯ã©ã¹ã®å ´åã次ã®åä½ãããã
+ *
+ * - X.Event.BEFORE_KILL_INSTANCE ãçºç«ãããæ»ãå¤ã®ããããã©ã°ã« X_Callback.PREVENT_DEFAULT ãç«ã¤å ´åãç ´æ£ããã£ã³ã»ã«ã X.Event.KILL_INSTANCE_CANCELED ãçºç«ããã
+ *
- ç ´æ£ã«é²ãå ´åã¯ãX.Event.KILL_INSTANCE ãçºç«ããã
+ *
- dispatch ä¸ã¯ãã¤ã³ã¹ã¿ã³ã¹ã®å
¨ã¦ã® dispatch ãçµäºããã¾ã§å®éã®ç ´æ£ãå¾
ã¤ã
+ *
- å®éã®ç ´æ£ã§ã¯ãã¤ã³ã¹ã¿ã³ã¹ã®ã¡ã³ãã®åé¤ã«å ãã¦å
¨ã¦ã®ã¤ãã³ããªã¹ãã解é¤ããã
*/
- kill : function(){
- var instance = this,
- klass = X_Class_getClass( instance ),
- def = X_Class_getClassDef( klass ),
- data, p, i;
- if( def.isPrivate && !X_Class_killPrivateFlag ){
- X.Logger.critical( 'PrivateInstance.kill() work in PrivateUser.kill().' );
- return;
- };
- X_Class_killPrivateFlag = false; // onKill å
㧠PrivateInstance.kill() ãé²ããã
+ // TODO kill ããã¤ã³ã¹ã¿ã³ã¹ã®ã¤ãã³ããæ®ã£ã¦ããªããï¼ããã¯éçºç¨ã®ã¿
+ 'kill' : function(){
+ var def, listeners, p;
- // onKill() === false ã®å ´åãkill ã®ãã£ã³ã»ã«
- // private 㯠false ã§ã® ãã£ã³ã»ã« ã¯ç¡è¦ããã
+ // TODO kill ä¸ã® kill ã®å¼ã³åºããé²ã, ç ´æ£æ¸ã®ã¤ã³ã¹ã¿ã³ã¹ã¸ã® kill
- if( this.instanceOf( X.EventDispatcher ) ){
- //console.log( 'this.instanceOf( X.EventDispatcher )! ' + this._dispatching );
- if( !def.isPrivate ){
- if( this._dispatching ){
- this.dispatch( X.Event.BEFORE_KILL_INSTANCE );
- this._killReserved = true;
- this.dispatch( X.Event.KILL_INSTANCE_CANCELED );
- return;
- } else
- if( this.dispatch( X.Event.BEFORE_KILL_INSTANCE ) & X.Callback.PREVENT_DEFAULT ){
- this.dispatch( X.Event.KILL_INSTANCE_CANCELED );
- return;
+ if( this[ 'instanceOf' ]( X_EventDispatcher ) ){
+
+ 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( p );
};
- } else {
- this.dispatch( X.Event.BEFORE_KILL_INSTANCE );
};
- this.dispatch( X.Event.KILL_INSTANCE );
- this._listeners && X_EventDispatcher_systemUnlisten( this ); //.unlisten();
- } else
- if( X.Type.isFunction( instance.onKill ) && instance.onKill() === false && !def.isPrivate ){
- return;
+
+ this[ 'dispatch' ]( X_EVENT_KILL_INSTANCE );
+ 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;
+ def.live.splice( def.live.indexOf( this ), 1 );
+ def.pool[ def.pool.length ] = this;
+ };
+ },
+
+ /**
+ * é¢æ°ã¯ Constructor å
ã§ä½¿ç¨ãã¾ããã¯ã©ã¹å®ç¾©ã辿ã£ã¦ã¹ã¼ãã¼ã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãæ¢ãã¾ãã
+ * å
é¨çã«ã¯ãå¼ã³åºããã³ã³ã¹ãã©ã¯ã¿ã¯é
åã«æ§ã(X_Class_CALLING_SUPER)ãå¼ã³åºããã³ã³ã¹ãã©ã¯ã¿å
ã§ããã« Super ãå¼ã°ããå ´åãé
åãå
ã«ããã«ã¹ã¼ãã¼ãªã³ã³ã¹ãã©ã¯ã¿ã辿ãã¾ãã
+ * @example Constructor : function( arg1, arg2 ){
+ * this.Super( aeg1, arg2 );
+ * }
+ * @param var_args {...?} 親ã³ã³ã¹ãã©ã¯ã¿ãå¼ã¶éã«æ¸¡ãä»»æã®æ°ã®å¼æ°
+ * @return {*}
+ */
+ // TODO ç¾å¨ new ãã¦ããã¤ã³ã¹ã¿ã³ã¹ãä¿æãã¦ãã§ãã¯ãã
+ 'Super' : function( var_args ){
+ var sClass = this,
+ i = X_Class_CALLING_SUPER.indexOf( sClass ),
+ n = -1,
+ l, sList, def, sConst, ret;
+
+ if( i === -1 ){
+ X_Class_CALLING_SUPER[ l = X_Class_CALLING_SUPER.length ] = sClass;
+ X_Class_CALL_SUPER_STACK[ l ] = sList = [];
+ } else {
+ sList = X_Class_CALL_SUPER_STACK[ i ];
};
- if( def.privateClass ){
- i = def.userList.indexOf( instance );
- if( i !== -1 ){
- data = X_Class_getPrivate( instance );
- X_Class_killPrivateFlag = true;
- if( data._dispatching && data.instanceOf( X.EventDispatcher ) ){
- data._killReserved = true;
- } else {
- data.kill();
+
+ while( sClass ){
+ 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 );
};
- def.dataList.splice( i, 1 );
- def.userList.splice( i, 1 );
+ return ret;
+ };
+ };
+ console.log( 'ã¹ã¼ãã¼ã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãè¦ã¤ããã¾ãã' );
+ },
+
+ /**
+ * func ã«ã¤ãã¦ã親ã¯ã©ã¹ã§è¨å®ããã¦ããååã®é¢æ°ã¡ã³ãã¼ãå¼ã³åºãã
+ * 第ä¸å¼æ°ã«é¢æ°ãæå®ãã2ã¤ä»¥ä¸ã®ç°ãªãååã§åãé¢æ°ãã¡ã³ãã¼ãããå ´åãåä½ãä¸ç¢ºå®ã«ãªãã¾ãã
+ * åè:ES5ãªJavascriptã§ã¢ãã³ãªã¯ã©ã¹çç¶æ¿ï¼ã¹ã¼ãã¼å¼ã³åºã
+ * @param funcNameOrFunc {Function|string} ã¹ã¼ãã¼ã¯ã©ã¹ã®é¢æ°å ã¾ãã¯ããªã¼ãã¼ã©ã¤ãæ¸ã®èªèº«ã®é¢æ°ã
+ * @param var_args {...*} ãªã¼ãã¼ã©ã¤ãå
é¢æ°ã«æ¸¡ãä»»æã®æ°ã®å¼æ°
+ * @example return this.superCall( arguments.callee, param0, param1, ... );
+ * @return {*} ãªã¼ãã¼ã©ã¤ãå
ã®é¢æ°ãå¼ã³åºããæ»ãå¤ã
+ */
+ 'superCall' : function( funcNameOrFunc, var_args ){
+ var sClass = this,
+ 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;
+ break;
+ };
+ };
+ if( !name ) return;
+ } else {
+ return;
+ };
+
+ if( X_EMPTY_OBJECT[ name ] ) return;
+
+ while( sClass ){
+ def = X_Class_getClassDef( sClass );
+ sClass = def.SuperClass;
+ sFunc = sClass.prototype[ name ];
+ if( sFunc === funcNameOrFunc ){
+ hit = true; // ç¾å¨ã®é¢æ°ã«ããã
+ } else
+ if( hit && X_Object_inObject( name, this ) ){
+ if( X_Type_isFunction( sFunc ) ){
+ switch( args.length ){
+ case 1 :
+ return sFunc.call( this );
+ case 2 :
+ return sFunc.call( this, args[ 1 ] );
+ case 3 :
+ return sFunc.call( this, args[ 1 ], args[ 2 ] );
+ case 4 :
+ return sFunc.call( this, args[ 1 ], args[ 2 ], args[ 3 ] );
+ default :
+ args = X_Object_cloneArray( args );
+ args.shift();
+ return sFunc.apply( this, args );
+ };
+ };
+ break;
};
};
},
- // TODO Super
- // superCall
-
- instanceOf : function( klass ){
+ /**
+ * ã¤ã³ã¹ã¿ã³ã¹ã®ã¯ã©ã¹ãï¼ã¾ãã¯ã¹ã¼ãã¼ã¯ã©ã¹ãï¼èª¿ã¹ãã
+ * instanceof æ§æããµãã¼ãããªãç°å¢(IE4,Mac IE5)ãæ³å®ããå ´åãå¿
ããã®ã¡ã½ããã使ç¨ãããã¨ã
+ * ã¯ã©ã¹ã®ã¤ã³ã¹ã¿ã³ã¹ãï¼ã ã調ã¹ããå ´å㯠this.constructor === klass ãé«éã
+ * @param klass {__ClassBase__} ã¯ã©ã¹å®ç¾©
+ * @return {boolean}
+ */
+ // TODO instanceof ã«å¯¾å¿ãããã©ã¦ã¶ã¯ãã¡ãã使ç¨
+ 'instanceOf' : function( klass ){
var Super = this;
if( this.constructor === klass ) return true;
while( Super = X_Class_getClassDef( Super ).SuperClass ){
@@ -108,53 +195,132 @@ X_Class_CommonProps =
return false;
}
};
+
// ------------------------------------------------------------------------- //
// --- interface ----------------------------------------------------------- //
// ------------------------------------------------------------------------- //
-/** @namespace */
-X.Class = {
+/*
+ * @enum {number}
+ * @const
+ */
+var X_Class = {
+ NONE : 0,
+ POOL_OBJECT : 1,
+ ABSTRACT : 2,
+ FINAL : 4,
+ SINGLETON : 8
+};
+
+/**
+ * Class ãå®ç¾©ã ã·ã¹ãã ã®ç®¡çä¸ã«ç½®ãã
+ *
prototype ç¶æ¿ã®ãã©ã¦ã¶æ¯ã®å·®ç°ãå¸åãã 以ä¸ããæé©ãªæ¹æ³ããã¦ãããã
+ *
+ *
+ * - Object.create ã¯ããã©ã¼ãã³ã¹ãæªãããªã®ã§ç¾å¨ã¯ä½¿ã£ã¦ããªãã
+ *
- SubClass.prototype.__proto__ = SuperClass.prototype;
+ *
- SubClass.prototype = new SuperClass;
+ *
+ *
+ *
+ * - X.Class.create( opt_settings, opt_name, opt_props ) ã§ã¯ã©ã¹ãç»é²ï¼
+ *
- ã³ã³ã¹ãã©ã¯ã¿ ã¨ãªãã¡ã½ããã¯ãopt_props å
ã® Constructor : function( arg ){ ... }, ã«æ¸ãï¼
+ *
- é常éã new 㧠ã¤ã³ã¹ã¿ã³ã¹çæ
+ *
- kill() ã§ãªãã¸ã§ã¯ããã¯ãªã¼ã³ãã¦åé¤ãpool ãæå¹ã®å ´å㯠pool ãããï¼
+ *
- pool ãæå¹ã®å ´åãnew 㧠pool ãããã¤ã³ã¹ã¿ã³ã¹ãè¿ãããï¼
+ *
+ * @namespace X.Class
+ * @alias X.Class
+ */
+X[ 'Class' ] = /** @lends X.Class */ {
+
+ /**
+ * è¨å®ãªãã
+ * @const
+ */
+ 'NONE' : X_Class.NONE,
+
/**
* ã¤ã³ã¹ã¿ã³ã¹ã¯ç ´æ£æ(this.kill())ã«ååããã次åã® new MyClass() æã«åå©ç¨ããã¾ãã
- * @memberof X.Class */
- POOL_OBJECT : 1,
+ * @const
+ */
+ 'POOL_OBJECT' : X_Class.POOL_OBJECT,
/**
* å®ç¾©ããã¯ã©ã¹ã¯æ½è±¡ã¯ã©ã¹ã«ãªãã¾ããnew AbstractClass() ã¨ããã¨ã¨ã©ã¼ã«ãªãã¾ãã
- * @memberof X.Class */
- ABSTRACT : 2,
-
-
- /** @memberof X.Class */
- FINAL : 4,
- /** @memberof X.Class */
- SUPER_ACCESS : 8,
- /** @memberof X.Class */
- PRIVATE_DATA : 16,
- /** @memberof X.Class */
- SINGLETON : 32, // æªå®è£
+ * @const
+ */
+ 'ABSTRACT' : X_Class.ABSTRACT,
+
+ /**
+ * ã¯ã©ã¹ã®ç¶æ¿ãç¦æ¢ããã
+ * @const
+ */
+ 'FINAL' : X_Class.FINAL,
+
+ /**
+ * æªå®è£
ãã§ãç®å°ã«ãªãã®ã§ä»ãã¦ããã¾ãããã
+ * @const
+ */
+ 'SINGLETON' : X_Class.SINGLETON,
+
+ 'create' : X_Class_create
- create : function( /* displayName, classSetting, opt_PrivateClass, props */ ){
+ // TODO collect
+};
+
+
+
+// ------------------------------------------------------------------------- //
+// --- implements ---------------------------------------------------------- //
+// ------------------------------------------------------------------------- //
+ /**
+ * ã¯ã©ã¹ãå®ç¾©ããã
+ * X.Class.create() ã«ããã¯ã©ã¹å®ç¾©ã¯å¿
ãããã³ã³ã¹ãã©ã¯ã¿('Constructor')ãå¿
è¦ã¨ãã¾ãããã¯ã©ã¹å®ç¾©æã«ã³ã³ã¹ãã©ã¯ã¿ãæªè¨å®ã®å ´åãã¹ã¼ãã¼ã¯ã©ã¹ãããã°ãã®ã³ã³ã¹ãã©ã¯ã¿ã使ç¨ãã¾ãã
+ * @alias X.Class.create
+ * @param {string} [displayName] ã¯ã©ã¹ã®åå
+ * @param {number} [classSetting=0] X_Class.POOL_OBJECT | X_Class.FINAL ãªã©
+ * @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;
- if( X.Type.isString( displayName ) === true ){
+ classDef = {},
+ cbHash = { proxy : X_Class_actualConstructor, classDef : classDef };
+
+ if( X_Type_isString( displayName ) === true ){
classDef.displayName = displayName;
args.shift();
};
// ã¯ã©ã¹è¨å®
classDef.setting = classSetting = args[ 0 ];
- if( X.Type.isNumber( classSetting ) ){
- 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( X_Type_isNumber( classSetting ) ){
+ opt_pool = !!( classSetting & X_Class.POOL_OBJECT );
+ opt_abstract = !!( classSetting & X_Class.ABSTRACT );
+ opt_final = !!( classSetting & X_Class.FINAL );
if( opt_final && opt_abstract ){
X.Logger.critical( 'final & Abstract!' );
return;
@@ -164,42 +330,29 @@ 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 ) ){
- // ãµãã¯ã©ã¹ã®å ´åãã¯ã©ã¹å®ç¾©ã®ä¸æ¸ãããªãã¦ãä½æå¯è½
- // ãµãã¯ã©ã¹ã§ãªãã¦ããã¯ã©ã¹ã¡ã³ãç¨ãªãã¸ã§ã¯ããç¡ãã§ãä½æå¯è½
- //if( !X_Class_traits ){
- // X.Logger.critical( 'No Class Def!' );
- // return;
- //};
+ if( !X_Type_isObject( props ) ){
+ // ã¯ã©ã¹ã¡ã³ãç¨ãªãã¸ã§ã¯ããç¡ãã§ãã¯ã©ã¹ã¯ä½æå¯è½
props = {};
} else
- if( props.Constructor && X.Type.isFunction( props.Constructor ) ){
- classDef.Constructor = 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 = { _ : X_Class_actualConstructor } ); // TODO hash = classDef
- hash.c = klass;
- klass.superClassOf = X_Class_superClassOf;
- klass.subClassOf = X_Class_subClassOf;
+ klass = X_Callback_actualClosure( cbHash ); // TODO callbackHash ã classå®ç¾©ã®ç½®ãå ´æã«ãã¦ãã¾ãï¼ãªãã»ã©â¦
+ cbHash.klass = klass;
+ klass[ 'superClassOf' ] = X_Class_superClassOf;
+ klass[ 'subClassOf' ] = X_Class_subClassOf;
if( X_Class_useObjectCreate ){
- klass.prototype = X_Class_override( X_Class_override( X_Class_traits || klass.prototype, props, true ), X_Class_CommonProps, false );
+ klass.prototype = X_Class_override( X_Class_override( X_Class_traits || klass.prototype, props, true ), X_Class_CommonMethods, false );
klass.prototype.constructor = klass;
} else
if( X_Class_use_proto_ ){
@@ -207,50 +360,36 @@ X.Class = {
if( X_Class_traits ){
klass.prototype.__proto__ = X_Class_traits;
} else {
- X_Class_override( klass.prototype, X_Class_CommonProps, false );
+ X_Class_override( klass.prototype, X_Class_CommonMethods, false );
};
} else {
- klass.prototype = X_Class_override( X_Class_override( X_Class_traits || klass.prototype, props, true ), X_Class_CommonProps, false );
+ klass.prototype = X_Class_override( X_Class_override( X_Class_traits || klass.prototype, props, true ), X_Class_CommonMethods, false );
klass.prototype.constructor = klass;
};
- klass.name = displayName;
+
+ klass[ 'name' ] = displayName;
if( opt_abstract ){
classDef.Abstract = true;
} 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;
+ 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;
- },
-
- _newPrivate : X_Class_newPrivate,
-
- _getPrivate : X_Class_getPrivate
-
-};
+ };
+
+
-// ------------------------------------------------------------------------- //
-// --- implements ---------------------------------------------------------- //
-// ------------------------------------------------------------------------- //
function X_Class_getClass( instance ){
var cList = X_Class_CLASS_LIST,
i = cList.length,
@@ -259,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 ){
@@ -275,60 +406,31 @@ 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 ã§è§£é¤ */
function X_Class_override( target, src, force ){
var p;
for( p in src ){
- if( p === 'Super' || p === 'SuperConstructor' || p === '__proto__' || p === 'prototype' || p === 'constructor' ){
- X.Logger.critical( 'Super & SuperConstructor is reserved!' );
+ if( p === 'Constructor' ) continue;
+ if( p === '__proto__' || p === 'prototype' || p === 'constructor' ){
+ X.Logger.critical( p + ' is reserved!' );
return;
};
- if( force || target[ p ] === void 0 ){
+ if( force || target[ p ] === undefined ){
target[ p ] = src[ p ];
};
};
return target;
};
+/**
+ * ã¹ã¼ãã¼ã¯ã©ã¹ãï¼èª¿ã¹ã¾ãã
+ * @alias __ClassBase__.superClassOf
+ * @param klass {__ClassBase__}
+ * @return {boolean}
+ */
function X_Class_superClassOf( klass ){
var myDef = X_Class_getClassDef( this ),
targetDef = X_Class_getClassDef( klass ),
@@ -343,13 +445,26 @@ function X_Class_superClassOf( klass ){
return false;
};
+/**
+ * ãµãã¯ã©ã¹ãï¼èª¿ã¹ã¾ãã
+ * @alias __ClassBase__.subClassOf
+ * @type {Function}
+ * @param klass {__ClassBase__}
+ * @return {boolean}
+ */
function X_Class_subClassOf( klass ){
- return X_Class_superClassOf.call( klass, this );
+ return klass && X_Class_superClassOf.call( klass, this );
};
-
-/* ãµãã¯ã©ã¹ãä½ãã¡ã½ãã
- * var subClass = superClass.inherits( ... )
- * http://d.hatena.ne.jp/m-hiyama/20051018/1129605002
+
+/**
+ * ãµãã¯ã©ã¹ãä½ãã¾ããä¸ããå¼æ°ã¯ X_Class.create ã¨åãã§ããhttp://d.hatena.ne.jp/m-hiyama/20051018/1129605002
+ * @alias __ClassBase__.inherits
+ * @example var SubClass = SuperClass.inherits( 'Sub', X_Class.FINAL, { ... } );
+ * @param {string} [displayName] ã¯ã©ã¹ã®åå
+ * @param {number} [classSetting=0] X_Class.POOL_OBJECT | X_Class.FINAL ãªã©
+ * @param {__ClassBase__=} [privateClass] ãã®ã¯ã©ã¹ã¨ãã¢ã§åä½ããã·ã£ãã¦ã¯ã©ã¹
+ * @param {object} [props={}] ãã®ã¯ã©ã¹ã®ã¡ã³ãã¨é¢æ°ãã³ã³ã¹ãã©ã¯ã¿ã¯ Constructor ã¨æ¸ããã¨
+ * @return {__ClassBase__}
*/
function X_Class_inherits( /* displayName, classSetting, opt_PrivateClass, props */ ){
var args = X_Object_cloneArray( arguments ),
@@ -358,12 +473,12 @@ function X_Class_inherits( /* displayName, classSetting, opt_PrivateClass, props
superDef = X_Class_getClassDef( Super ),
displayName = args[ 0 ],
classSetting,
- opt_super,
+ //opt_super,
klass, def;
if( superDef.Final ) X.Logger.critical( 'X.Class inherits, Class is final!' );
// ãµãã¯ã©ã¹å
- if( X.Type.isString( displayName ) ){
+ if( X_Type_isString( displayName ) ){
args.shift();
} else {
displayName = 'SubClass of ' + superDef.displayName;
@@ -372,24 +487,22 @@ function X_Class_inherits( /* displayName, classSetting, opt_PrivateClass, props
// ãµãã¯ã©ã¹è¨å®
classSetting = args[ 0 ];
- if( X.Type.isNumber( classSetting ) ){
+ if( X_Type_isNumber( classSetting ) ){
args.shift();
} else {
// ã¯ã©ã¹è¨å®ããªãå ´åã親ããã³ãã¼ãã¦ãAbstract flag ã¯è½ã¨ã??
- classSetting = superDef.setting;// &= ~X.Class.ABSTRACT;
+ classSetting = superDef.setting;// &= ~X_Class.ABSTRACT;
};
- if( superDef.isPrivate ) classSetting = classSetting | X.Class.PRIVATE_DATA;
- opt_super = !!( classSetting & X.Class.SUPER_ACCESS );
+
params.push( classSetting );
// ãµãã¯ã©ã¹ã®ã·ã£ãã¦
if( args[ 0 ] && X_Class_getClass( args[ 0 ] ) ){
params.push( args.shift() );
- } else
- if( superDef.privateClass ){
- params.push( superDef.privateClass );
};
- params.push( args[ 0 ] ); /* props ãµãã¯ã©ã¹ã§ã¯æªå®ç¾©ã§ãå¯ */
+
+ /* props æªå®ç¾©ã§ãå¯ */
+ params.push( args[ 0 ] );
// ç¶æ¿ã¯ã©ã¹ã®ä½æ
if( X_Class_useObjectCreate ){
@@ -398,23 +511,16 @@ function X_Class_inherits( /* displayName, classSetting, opt_PrivateClass, props
if( X_Class_use_proto_ ){
X_Class_traits = Super.prototype;
} else {
- //Super.__new = null;
X_Class_traits = new Super( X_Closure_COMMAND_DROP );
- //Super.__new = X_Class_actualConstructor;
};
- klass = X.Class.create.apply( X.Class, params );
+ klass = X_Class_create.apply( X.Class, params );
X_Class_traits = null;
def = X_Class_getClassDef( klass );
// ç¶æ¿ç¨ããããã£ãæ§ãã
- if( opt_super === true ){
- def.superAccess = true;
- def.SuperClass = Super;
- def.SuperProto = Super.prototype;
- def.SuperConstructor = superDef.Constructor || superDef.SuperConstructor;
- } else {
- def.SuperClass = Super; // instanceOf() ã§è¦ªã¯ã©ã¹ã調ã¹ãï¼
- };
+ def.SuperClass = Super;
+ def.SuperProto = Super.prototype;
+ def.SuperConstructor = superDef.Constructor || superDef.SuperConstructor;
return klass;
};
@@ -423,85 +529,34 @@ function X_Class_inherits( /* displayName, classSetting, opt_PrivateClass, props
* new ã®å®ä½ï¼ã³ã³ã¹ãã©ã¯ã¿ã®æ©è½ã¯ instance.Constructor ã«æ¸ãï¼
* ããã«ãã pool ããã ãªãã¸ã§ã¯ãï¼ç ´æ£ãããã¤ã³ã¹ã¿ã³ã¹ï¼ ãåå©ç¨ã§ãã
*/
-function X_Class_actualConstructor( obj, args ){
- var klass = obj.c,//this,
- def = X_Class_getClassDef( klass ),
- dataUser = def._tempUser,
- instance, obj,
- userDef;
+function X_Class_actualConstructor( f, args ){
+ var klass = f.klass,
+ 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;
- };
- //klass.__new = null;
- 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 );
- //klass.__new = X_Class_actualConstructor;
- 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 );
- };
- if( def.superAccess ){
- // TODO klass.prototype ã«ç§»å
- instance.Super = def.SuperProto;
- instance.SuperConstructor = X_Class_superConstructor;
- };
+ 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
- instance.kill();
+
+ if( obj !== instance && ( X_Type_isObject( obj ) || X_Type_isFunction( obj ) ) ){ // Class
+ instance[ 'kill' ]();
return obj;
};
return instance;
};
-/* ã¯ã©ã¹å®ç¾©ã辿ã£ã¦ã¹ã¼ãã¼ã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãæ¢ãã
- * å¼ã³åºããã³ã³ã¹ãã©ã¯ã¿ã¯é
åã«æ§ããã
- * ããã«å¼ã°ããå ´åãé
åãå
ã«ããã«å¥¥ã®ã³ã³ã¹ãã©ã¯ã¿ãåå¾
- * TODO ç¾å¨ new ãã¦ããã¤ã³ã¹ã¿ã³ã¹ãä¿æãã¦ãã§ãã¯ãã
- */
-function X_Class_superConstructor(){
- var sClass = this,
- i = X_Class_CALLING_SUPER.indexOf( sClass ),
- n = -1,
- l, sList, def, sConst, ret;
-
- if( i === -1 ){
- X_Class_CALLING_SUPER[ l = X_Class_CALLING_SUPER.length ] = sClass;
- X_Class_CALL_SUPER_STACK[ l ] = sList = [];
- } else {
- sList = X_Class_CALL_SUPER_STACK[ i ];
- };
-
- while( sClass ){
- 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;
- };
- };
-};
console.log( 'X.Core.Class' );