OSDN Git Service

Version 0.6.159, fix X.Class & X.XHR.Gadget.
[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         // TODO rename to copy\r
33         'clone'      : X_Object_clone,\r
34         \r
35         'override'   : X_Object_override,\r
36         \r
37         'clear'      : X_Object_clear,\r
38         \r
39         'deepCopy'   : X_Object_deepCopy,\r
40         \r
41         // TODO rename to X.Array.copy\r
42         'cloneArray' : X_Object_cloneArray,\r
43         \r
44         'isEmpty'    : X_Object_isEmpty,\r
45         \r
46         'inObject'   : X_Object_inObject\r
47         \r
48         // TODO hasOwnProperty\r
49 };\r
50 \r
51 // ------------------------------------------------------------------------- //\r
52 // --- implements ---------------------------------------------------------- //\r
53 // ------------------------------------------------------------------------- //\r
54 /**\r
55  * 単純なクローンでメンバーをコピーしたオブジェクトを返します。 k in null でエラーになる Opera7- に対策済。\r
56  * @alias X.Object.clone\r
57  * @param {object|Array} src コピー元のオブジェクトです。\r
58  * @return {object|Array}\r
59  */\r
60 function X_Object_clone( src ){\r
61         var ret, k;\r
62         \r
63         if( !src || !X_Type_isObject( src ) ) return src;\r
64         \r
65         ret = {};\r
66         for( k in src ){\r
67                 //if( X_EMPTY_OBJECT[ k ] ) continue;\r
68                 ret[ k ] = src[ k ];\r
69         };\r
70         return ret;\r
71 };\r
72 \r
73 /**\r
74  * オブジェクトにオブジェトのメンバーをコピーします。同じ名前のメンバーは上書きされます。\r
75  * @alias X.Object.override\r
76  * @param {object} target コピーされるオブジェクトです。返り値はこのオブジェクトです。\r
77  * @param {object} src コピー元のオブジェクトです。\r
78  * @return {object} target が返る。\r
79  */\r
80 function X_Object_override( target, src ){\r
81         var k;\r
82         if( !src || !X_Type_isObject( src ) ) return target;\r
83         for( k in src ){\r
84                 //if( X_EMPTY_OBJECT[ k ] ) continue;\r
85                 target[ k ] = src[ k ];\r
86         };\r
87         return target;\r
88 };\r
89 \r
90 /**\r
91  * オブジェクトの全てのメンバーを破棄します。\r
92  * @alias X.Object.clear\r
93  * @param {object} obj。\r
94  */\r
95 function X_Object_clear( obj, k ){\r
96         if( obj ){\r
97                 for( k in obj ){\r
98                         delete obj[ k ];\r
99                 };\r
100         };\r
101 };\r
102 \r
103 \r
104 /**\r
105  * オブジェクト(object, Array)のメンバーを探索して、ディープコピーしたオブジェクトを返します。\r
106  * オブジェクトが循環参照している場合は、既にコピーしているオブジェクトが現れた時点で、先に作成しているコピーの参照を返すので無限にループすることはありません。\r
107  * @alias X.Object.deepCopy\r
108  * @param {object|Array} src コピー元のオブジェクトです。\r
109  * @return {object|Array}\r
110  */\r
111 function X_Object_deepCopy( src ){              \r
112         return X_Object_deepCopy_( src, [], [], -1 );\r
113 };\r
114 \r
115 function X_Object_deepCopy_( src, objSrc, objCopy, n ) {\r
116         var ret, i, k;\r
117         \r
118         if( !src ){ // 0, "", null, undefined, NaN, false\r
119                 return src;\r
120         } else\r
121         if( X_Type_isArray( src ) ){\r
122                 i = objSrc.indexOf( src );\r
123                 if( i !== -1 ) return objCopy[ i ];\r
124                 objSrc[ ++n ] = src;\r
125                 objCopy[ n ]  = ret = [];\r
126         } else\r
127         if( X_Type_isObject( src ) ){\r
128                 i = objSrc.indexOf( src );\r
129                 if( i !== -1 ) return objCopy[ i ];\r
130                 objSrc[ ++n ] = src;\r
131                 objCopy[ n ]  = ret = {};\r
132         } else {\r
133                 // string, number, true\r
134                 return src;\r
135         };\r
136         for( k in src ){\r
137                 //if( X_EMPTY_OBJECT[ k ] ) continue;\r
138                 ret[ k ] = X_Object_deepCopy_( src[ k ], objSrc, objCopy, n );\r
139         };\r
140         return ret;\r
141 };\r
142 \r
143 /**\r
144  * 単純にメンバーをコピーした Array を返します。\r
145  * @alias X.Object.cloneArray\r
146  * @param {Array} ary コピー元のオブジェクトです。\r
147  * @return {Array}\r
148  */\r
149 function X_Object_cloneArray( ary ){\r
150         var ret = [],\r
151                 i = ary.length;\r
152 \r
153         if( !i ) return ret;\r
154         for( ; i; ){\r
155                 ret[ --i ] = ary[ i ];\r
156         };\r
157         return ret;\r
158 };\r
159 \r
160 /**\r
161  * object が空か?調べます。 object でない場合、undefined が返る\r
162  * @alias X.Object.isEmpty\r
163  * @param {object} v \r
164  * @return {boolean|undefined}\r
165  */\r
166 function X_Object_isEmpty( v ){\r
167         if( !v ) return;\r
168         for( var k in v ){\r
169                 //if( X_EMPTY_OBJECT[ _k ] ) continue;\r
170                 return false;//if( v.hasOwnProperty && v.hasOwnProperty( p ) ) return false; ie4 で動かない、、、\r
171         };\r
172         return true;\r
173 };\r
174 \r
175 /*      \r
176 X.matchTest = function( array1, array2 ){\r
177         var i = array2.length;\r
178         for( ; i; ){\r
179                 if( array1.indexOf( array2[ --i ] ) === -1 ) return false;\r
180         };\r
181         return true;\r
182 }; */\r