OSDN Git Service

7e42e0c3f4c32b1a9ce3723e31a416a0520bf893
[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|number} 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, p ){\r
12                 if( obj[ name ] ) return true; // quick\r
13                 name += ''; // 数値も許可\r
14                 for( p in obj ){\r
15                         if( p === name ) return true;\r
16                 };\r
17                 return false;\r
18         }) :\r
19         new Function( 'a,b', 'return a in b' );\r
20 \r
21 \r
22 // ------------------------------------------------------------------------- //\r
23 // --- interface ----------------------------------------------------------- //\r
24 // ------------------------------------------------------------------------- //\r
25 \r
26 /**\r
27  * Object に関するメソッドを集めたものです。\r
28  * @namespace X.Object\r
29  * @alias X.Object\r
30  */\r
31 X[ 'Object' ] = {\r
32 \r
33         'copy'       : X_Object_copy,\r
34         \r
35         'deepCopy'   : X_Object_deepCopy,\r
36         \r
37         'override'   : X_Object_override,\r
38         \r
39         'clear'      : X_Object_clear,\r
40         \r
41         'isEmpty'    : X_Object_isEmpty,\r
42         \r
43         'inObject'   : X_Object_inObject\r
44         \r
45         // TODO hasOwnProperty\r
46 };\r
47 \r
48 // ------------------------------------------------------------------------- //\r
49 // --- implements ---------------------------------------------------------- //\r
50 // ------------------------------------------------------------------------- //\r
51 /**\r
52  * 単純なクローンでメンバーをコピーしたオブジェクトを返します。 k in null でエラーになる Opera7- に対策済。\r
53  * @alias X.Object.copy\r
54  * @param {object|Array} src コピー元のオブジェクトです。\r
55  * @return {object|Array}\r
56  */\r
57 function X_Object_copy( src ){\r
58         var ret, k;\r
59         \r
60         if( !src || !X_Type_isObject( src ) ) return src;\r
61         \r
62         ret = {};\r
63         for( k in src ){\r
64                 //if( X_EMPTY_OBJECT[ k ] ) continue;\r
65                 ret[ k ] = src[ k ];\r
66         };\r
67         return ret;\r
68 };\r
69 \r
70 /**\r
71  * オブジェクトにオブジェトのメンバーをコピーします。同じ名前のメンバーは上書きされます。\r
72  * @alias X.Object.override\r
73  * @param {object} target コピーされるオブジェクトです。返り値はこのオブジェクトです。\r
74  * @param {object} src コピー元のオブジェクトです。\r
75  * @return {object} target が返る。\r
76  */\r
77 function X_Object_override( target, src ){\r
78         var k;\r
79         if( !src || !X_Type_isObject( src ) ) return target;\r
80         for( k in src ){\r
81                 //if( X_EMPTY_OBJECT[ k ] ) continue;\r
82                 target[ k ] = src[ k ];\r
83         };\r
84         return target;\r
85 };\r
86 \r
87 /**\r
88  * オブジェクトの全てのメンバーを破棄します。\r
89  * @alias X.Object.clear\r
90  * @param {object} obj。\r
91  */\r
92 function X_Object_clear( obj, k ){\r
93         if( obj ){\r
94                 for( k in obj ){\r
95                         delete obj[ k ];\r
96                 };\r
97         };\r
98 };\r
99 \r
100 \r
101 /**\r
102  * オブジェクト(object, Array)のメンバーを探索して、ディープコピーしたオブジェクトを返します。\r
103  * オブジェクトが循環参照している場合は、既にコピーしているオブジェクトが現れた時点で、先に作成しているコピーの参照を返すので無限にループすることはありません。\r
104  * @alias X.Object.deepCopy\r
105  * @param {object|Array} src コピー元のオブジェクトです。\r
106  * @return {object|Array}\r
107  */\r
108 function X_Object_deepCopy( src ){              \r
109         return X_Object_deepCopy_( src, [], [], -1 );\r
110 };\r
111 \r
112 function X_Object_deepCopy_( src, objSrc, objCopy, n ) {\r
113         var ret, i, k;\r
114         \r
115         if( !src ){ // 0, "", null, undefined, NaN, false\r
116                 return src;\r
117         } else\r
118         if( X_Type_isArray( src ) ){\r
119                 i = objSrc.indexOf( src );\r
120                 if( i !== -1 ) return objCopy[ i ];\r
121                 objSrc[ ++n ] = src;\r
122                 objCopy[ n ]  = ret = [];\r
123         } else\r
124         if( X_Type_isObject( src ) ){\r
125                 i = objSrc.indexOf( src );\r
126                 if( i !== -1 ) return objCopy[ i ];\r
127                 objSrc[ ++n ] = src;\r
128                 objCopy[ n ]  = ret = {};\r
129         } else {\r
130                 // string, number, true\r
131                 return src;\r
132         };\r
133         for( k in src ){\r
134                 //if( X_EMPTY_OBJECT[ k ] ) continue;\r
135                 ret[ k ] = X_Object_deepCopy_( src[ k ], objSrc, objCopy, n );\r
136         };\r
137         return ret;\r
138 };\r
139 \r
140 /**\r
141  * object が空か?調べます。 object でない場合、undefined が返る\r
142  * @alias X.Object.isEmpty\r
143  * @param {object} v \r
144  * @return {boolean|undefined}\r
145  */\r
146 function X_Object_isEmpty( v ){\r
147         if( !v ) return;\r
148         for( var k in v ){\r
149                 //if( X_EMPTY_OBJECT[ _k ] ) continue;\r
150                 return false;//if( v.hasOwnProperty && v.hasOwnProperty( p ) ) return false; ie4 で動かない、、、\r
151         };\r
152         return true;\r
153 };\r
154 \r