OSDN Git Service

Version 0.6.132, fix X.Node._flags & fix X.EventDispatcher._listeners & start to...
[pettanr/clientJs.git] / 0.6.x / js / 01_core / 04_XObject.js
1 /**\r
2  * name in object 構文が使えない環境で構文解析エラーを回避するためにこのメソッドを使用します。\r
3  * 但し for( name in object ) については構文解析エラーになる環境はありません。\r
4  * @alias X.Object.inObject\r
5  * @function\r
6  * @param {string} name \r
7  * @param {object} obj \r
8  * @return {boolean} name が定義されている(値が undefined や null でも) -> true\r
9  */\r
10 var X_Object_inObject = X_UA.IE < 5.5 ? // TODO JScript で判定\r
11         (function( name, obj ){\r
12                 var p;\r
13                 if( obj[ name ] ) return true; // quick\r
14                 name += ''; // 数値も許可\r
15                 for( p in obj ){\r
16                         if( p === name ) return true;\r
17                 };\r
18                 return false;\r
19         }) :\r
20         new Function( 'a,b', 'return a in b' );// なぜか ie5 でもerror\r
21 \r
22 /**\r
23  * Object に関するメソッドを集めたものです。\r
24  * @namespace X.Object\r
25  * @alias X.Object\r
26  */\r
27 X.Object = {\r
28         // TODO rename to copy\r
29         clone      : X_Object_clone,\r
30         \r
31         override   : X_Object_override,\r
32         \r
33         deepCopy   : X_Object_deepCopy,\r
34         \r
35         // TODO rename to X.Array.copy\r
36         cloneArray : X_Object_cloneArray,\r
37         \r
38         isEmpty    : X_Object_isEmpty,\r
39         \r
40         inObject   : X_Object_inObject\r
41         \r
42         // TODO hasOwnProperty\r
43 };\r
44 \r
45 /**\r
46  * 単純なクローンでメンバーをコピーしたオブジェクトを返します。\r
47  * @alias X.Object.clone\r
48  * @param {object|Array} src コピー元のオブジェクトです。\r
49  * @return {object|Array}\r
50  */\r
51 function X_Object_clone( src ){\r
52         var ret, k;\r
53         if( typeof src !== 'object' ) return src;\r
54         ret = {};\r
55         for( k in src ){\r
56                 //if( X_EMPTY_OBJECT[ k ] ) continue;\r
57                 ret[ k ] = src[ k ];\r
58         };\r
59         return ret;\r
60 };\r
61 \r
62 /**\r
63  * オブジェクトにオブジェトのメンバーをコピーします。同じ名前のメンバーは上書きされます。\r
64  * @alias X.Object.override\r
65  * @param {object} target コピーされるオブジェクトです。返り値はこのオブジェクトです。\r
66  * @param {object} src コピー元のオブジェクトです。\r
67  * @return {object} target が返る。\r
68  */\r
69 function X_Object_override( target, src ){\r
70         var k;\r
71         if( !X.Type.isObject( src ) ) return target;\r
72         for( k in src ){\r
73                 //if( X_EMPTY_OBJECT[ k ] ) continue;\r
74                 target[ k ] = src[ k ];\r
75         };\r
76         return target;\r
77 };\r
78 \r
79 /**\r
80  * オブジェクト(object, Array)のメンバーを探索して、ディープコピーしたオブジェクトを返します。\r
81  * オブジェクトが循環参照している場合は、既にコピーしているオブジェクトが現れた時点で、先に作成しているコピーの参照を返すので無限にループすることはありません。\r
82  * @alias X.Object.deepCopy\r
83  * @param {object|Array} src コピー元のオブジェクトです。\r
84  * @return {object|Array}\r
85  */\r
86 function X_Object_deepCopy( src ){              \r
87         return X_Object_deepCopy_( src, [], [], -1 );\r
88 };\r
89 \r
90 function X_Object_deepCopy_( src, objSrc, objCopy, n ) {\r
91         var ret, i, k;\r
92         if( !src ){ // 0, "", null, undefined, NaN, false\r
93                 return src;\r
94         } else\r
95         if( X.Type.isArray( src ) ){\r
96                 i = objSrc.indexOf( src );\r
97                 if( i !== -1 ) return objCopy[ i ];\r
98                 objSrc[ ++n ] = src;\r
99                 objCopy[ n ]  = ret = [];\r
100         } else\r
101         if( X.Type.isObject( src ) ){\r
102                 i = objSrc.indexOf( src );\r
103                 if( i !== -1 ) return objCopy[ i ];\r
104                 objSrc[ ++n ] = src;\r
105                 objCopy[ n ]  = ret = {};\r
106         } else {\r
107                 // string, number, true\r
108                 return src;\r
109         };\r
110         for( k in src ){\r
111                 //if( X_EMPTY_OBJECT[ k ] ) continue;\r
112                 ret[ k ] = clone( src[ k ], objSrc, objCopy, n );\r
113         };\r
114         return ret;\r
115 };\r
116 \r
117 /**\r
118  * 単純にメンバーをコピーした Array を返します。\r
119  * @alias X.Object.cloneArray\r
120  * @param {Array} ary コピー元のオブジェクトです。\r
121  * @return {Array}\r
122  */\r
123 function X_Object_cloneArray( ary ){\r
124         var ret = [],\r
125                 i = ary.length;\r
126         if( !i ) return ret;\r
127         for( ; i; ){\r
128                 ret[ --i ] = ary[ i ];\r
129         };\r
130         return ret;\r
131 };\r
132 \r
133 /**\r
134  * object が空か?調べます。\r
135  * @alias X.Object.isEmpty\r
136  * @param {object} v \r
137  * @return {boolean}\r
138  */\r
139 function X_Object_isEmpty( v ){\r
140         var k;\r
141         for( k in v ){\r
142                 //if( X_EMPTY_OBJECT[ k ] ) continue;\r
143                 return false;//if( v.hasOwnProperty && v.hasOwnProperty( p ) ) return false; ie4 で動かない、、、\r
144         };\r
145         return true;\r
146 };\r
147 \r
148 /*      \r
149 X.matchTest = function( array1, array2 ){\r
150         var i = array2.length;\r
151         for( ; i; ){\r
152                 if( array1.indexOf( array2[ --i ] ) === -1 ) return false;\r
153         };\r
154         return true;\r
155 }; */\r