X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=0.6.x%2Fjs%2F01_core%2F04_XObject.js;h=1dcde48069c5d74dcc4e79f44aad17c4cdfceb68;hb=d836e6243878426d4cfd7a14ceb9b77db9f92b57;hp=3e57b52042e60c0da0b7c50523092ee68702cfc7;hpb=714d9a512e8d9e09001183ebf15f549ea51e48ad;p=pettanr%2FclientJs.git diff --git a/0.6.x/js/01_core/04_XObject.js b/0.6.x/js/01_core/04_XObject.js index 3e57b52..1dcde48 100644 --- a/0.6.x/js/01_core/04_XObject.js +++ b/0.6.x/js/01_core/04_XObject.js @@ -1,8 +1,16 @@ - -var X_Object_inObject = X.UA.IE < 5.5 ? // TODO JScript で判定 +/** + * name in object 構文が使えない環境で構文解析エラーを回避するためにこのメソッドを使用します。 + * 但し for( name in object ) については構文解析エラーになる環境はありません。 + * @alias X.Object.inObject + * @function + * @param {string} name + * @param {object} obj + * @return {boolean} name が定義されている(値が undefined や null でも) -> true + */ +var X_Object_inObject = X_UA[ 'IE' ] < 5.5 ? // TODO JScript で判定 (function( name, obj ){ var p; - if( obj[ name ] ) return true; + if( obj[ name ] ) return true; // quick name += ''; // 数値も許可 for( p in obj ){ if( p === name ) return true; @@ -12,45 +20,93 @@ var X_Object_inObject = X.UA.IE < 5.5 ? // TODO JScript で判定 new Function( 'a,b', 'return a in b' );// なぜか ie5 でもerror -X.Object = { +// ------------------------------------------------------------------------- // +// --- interface ----------------------------------------------------------- // +// ------------------------------------------------------------------------- // + +/** + * Object に関するメソッドを集めたものです。 + * @namespace X.Object + * @alias X.Object + */ +X[ 'Object' ] = { + // TODO rename to copy + 'clone' : X_Object_clone, - clone : X_Object_clone, + 'override' : X_Object_override, - deepCopy : X_Object_deepCopy, + 'deepCopy' : X_Object_deepCopy, - cloneArray : X_Object_cloneArray, + // TODO rename to X.Array.copy + 'cloneArray' : X_Object_cloneArray, - isEmpty : X_Object_isEmpty, + 'isEmpty' : X_Object_isEmpty, - inObject : X_Object_inObject -}; + 'inObject' : X_Object_inObject + // TODO hasOwnProperty +}; + +// ------------------------------------------------------------------------- // +// --- implements ---------------------------------------------------------- // +// ------------------------------------------------------------------------- // +/** + * 単純なクローンでメンバーをコピーしたオブジェクトを返します。 + * @alias X.Object.clone + * @param {object|Array} src コピー元のオブジェクトです。 + * @return {object|Array} + */ function X_Object_clone( src ){ var ret, k; if( typeof src !== 'object' ) return src; ret = {}; for( k in src ){ + //if( X_EMPTY_OBJECT[ k ] ) continue; ret[ k ] = src[ k ]; }; return ret; }; +/** + * オブジェクトにオブジェトのメンバーをコピーします。同じ名前のメンバーは上書きされます。 + * @alias X.Object.override + * @param {object} target コピーされるオブジェクトです。返り値はこのオブジェクトです。 + * @param {object} src コピー元のオブジェクトです。 + * @return {object} target が返る。 + */ +function X_Object_override( target, src ){ + var k; + if( !X_Type_isObject( src ) ) return target; + for( k in src ){ + //if( X_EMPTY_OBJECT[ k ] ) continue; + target[ k ] = src[ k ]; + }; + return target; +}; + +/** + * オブジェクト(object, Array)のメンバーを探索して、ディープコピーしたオブジェクトを返します。 + * オブジェクトが循環参照している場合は、既にコピーしているオブジェクトが現れた時点で、先に作成しているコピーの参照を返すので無限にループすることはありません。 + * @alias X.Object.deepCopy + * @param {object|Array} src コピー元のオブジェクトです。 + * @return {object|Array} + */ function X_Object_deepCopy( src ){ return X_Object_deepCopy_( src, [], [], -1 ); }; function X_Object_deepCopy_( src, objSrc, objCopy, n ) { - var ret, i, key; + var ret, i, k; if( !src ){ // 0, "", null, undefined, NaN, false return src; } else - if( X.Type.isArray( src ) ){ + if( X_Type_isArray( src ) ){ i = objSrc.indexOf( src ); if( i !== -1 ) return objCopy[ i ]; objSrc[ ++n ] = src; objCopy[ n ] = ret = []; } else - if( X.Type.isObject( src ) ){ + if( X_Type_isObject( src ) ){ i = objSrc.indexOf( src ); if( i !== -1 ) return objCopy[ i ]; objSrc[ ++n ] = src; @@ -59,24 +115,39 @@ function X_Object_deepCopy_( src, objSrc, objCopy, n ) { // string, number, true return src; }; - for( key in src ){ - ret[ key ] = clone( src[ key ], objSrc, objCopy, n ); + for( k in src ){ + //if( X_EMPTY_OBJECT[ k ] ) continue; + ret[ k ] = clone( src[ k ], objSrc, objCopy, n ); }; return ret; }; +/** + * 単純にメンバーをコピーした Array を返します。 + * @alias X.Object.cloneArray + * @param {Array} ary コピー元のオブジェクトです。 + * @return {Array} + */ function X_Object_cloneArray( ary ){ - var ret = [], i = ary.length; + var ret = [], + i = ary.length; if( !i ) return ret; for( ; i; ){ ret[ --i ] = ary[ i ]; }; return ret; }; - + +/** + * object が空か?調べます。 + * @alias X.Object.isEmpty + * @param {object} v + * @return {boolean} + */ function X_Object_isEmpty( v ){ - var p; - for( p in v ){ + var k; + for( k in v ){ + //if( X_EMPTY_OBJECT[ k ] ) continue; return false;//if( v.hasOwnProperty && v.hasOwnProperty( p ) ) return false; ie4 で動かない、、、 }; return true;