OSDN Git Service

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