2 * name in object 構文が使えない環境で構文解析エラーを回避するためにこのメソッドを使用します。
\r
3 * 但し for( name in object ) については構文解析エラーになる環境はありません。
\r
4 * @alias X.Object.inObject
\r
6 * @param {string} name
\r
7 * @param {object} obj
\r
8 * @return {boolean} name が定義されている(値が undefined や null でも) -> true
\r
10 var X_Object_inObject = X_UA.IE < 5.5 ? // TODO JScript で判定
\r
11 (function( name, obj ){
\r
13 if( obj[ name ] ) return true; // quick
\r
14 name += ''; // 数値も許可
\r
16 if( p === name ) return true;
\r
20 new Function( 'a,b', 'return a in b' );// なぜか ie5 でもerror
\r
23 * Object に関するメソッドを集めたものです。
\r
24 * @namespace X.Object
\r
28 // TODO rename to copy
\r
29 clone : X_Object_clone,
\r
31 override : X_Object_override,
\r
33 deepCopy : X_Object_deepCopy,
\r
35 // TODO rename to X.Array.copy
\r
36 cloneArray : X_Object_cloneArray,
\r
38 isEmpty : X_Object_isEmpty,
\r
40 inObject : X_Object_inObject
\r
42 // TODO hasOwnProperty
\r
46 * 単純なクローンでメンバーをコピーしたオブジェクトを返します。
\r
47 * @alias X.Object.clone
\r
48 * @param {object|Array} src コピー元のオブジェクトです。
\r
49 * @return {object|Array}
\r
51 function X_Object_clone( src ){
\r
53 if( typeof src !== 'object' ) return src;
\r
56 //if( X_EMPTY_OBJECT[ k ] ) continue;
\r
57 ret[ k ] = src[ k ];
\r
63 * オブジェクトにオブジェトのメンバーをコピーします。同じ名前のメンバーは上書きされます。
\r
64 * @alias X.Object.override
\r
65 * @param {object} target コピーされるオブジェクトです。返り値はこのオブジェクトです。
\r
66 * @param {object} src コピー元のオブジェクトです。
\r
67 * @return {object} target が返る。
\r
69 function X_Object_override( target, src ){
\r
71 if( !X.Type.isObject( src ) ) return target;
\r
73 //if( X_EMPTY_OBJECT[ k ] ) continue;
\r
74 target[ k ] = src[ k ];
\r
80 * オブジェクト(object, Array)のメンバーを探索して、ディープコピーしたオブジェクトを返します。
\r
81 * オブジェクトが循環参照している場合は、既にコピーしているオブジェクトが現れた時点で、先に作成しているコピーの参照を返すので無限にループすることはありません。
\r
82 * @alias X.Object.deepCopy
\r
83 * @param {object|Array} src コピー元のオブジェクトです。
\r
84 * @return {object|Array}
\r
86 function X_Object_deepCopy( src ){
\r
87 return X_Object_deepCopy_( src, [], [], -1 );
\r
90 function X_Object_deepCopy_( src, objSrc, objCopy, n ) {
\r
92 if( !src ){ // 0, "", null, undefined, NaN, false
\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
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
107 // string, number, true
\r
111 //if( X_EMPTY_OBJECT[ k ] ) continue;
\r
112 ret[ k ] = clone( src[ k ], objSrc, objCopy, n );
\r
118 * 単純にメンバーをコピーした Array を返します。
\r
119 * @alias X.Object.cloneArray
\r
120 * @param {Array} ary コピー元のオブジェクトです。
\r
123 function X_Object_cloneArray( ary ){
\r
126 if( !i ) return ret;
\r
128 ret[ --i ] = ary[ i ];
\r
135 * @alias X.Object.isEmpty
\r
136 * @param {object} v
\r
137 * @return {boolean}
\r
139 function X_Object_isEmpty( v ){
\r
142 //if( X_EMPTY_OBJECT[ k ] ) continue;
\r
143 return false;//if( v.hasOwnProperty && v.hasOwnProperty( p ) ) return false; ie4 で動かない、、、
\r
149 X.matchTest = function( array1, array2 ){
\r
150 var i = array2.length;
\r
152 if( array1.indexOf( array2[ --i ] ) === -1 ) return false;
\r