OSDN Git Service

Version 0.6.157, add X.Net.Form & fix X.EventDispatcher.
[pettanr/clientJs.git] / 0.6.x / js / 01_core / 04_XObject.js
index 283ade5..c12c3bd 100644 (file)
@@ -3,13 +3,12 @@
  * 但し for( name in object ) については構文解析エラーになる環境はありません。\r
  * @alias X.Object.inObject\r
  * @function\r
- * @param {string} name \r
+ * @param {string|number} name \r
  * @param {object} obj \r
  * @return {boolean} name が定義されている(値が undefined や null でも) -> true\r
  */\r
-var X_Object_inObject = X_UA.IE < 5.5 ? // TODO JScript で判定\r
-       (function( name, obj ){\r
-               var p;\r
+var X_Object_inObject = X_UA[ 'IE' ] < 5.5 ? // TODO JScript で判定\r
+       (function( name, obj, p ){\r
                if( obj[ name ] ) return true; // quick\r
                name += ''; // 数値も許可\r
                for( p in obj ){\r
@@ -17,40 +16,50 @@ var X_Object_inObject = X_UA.IE < 5.5 ? // TODO JScript で判定
                };\r
                return false;\r
        }) :\r
-       new Function( 'a,b', 'return a in b' );// なぜか ie5 でもerror\r
+       new Function( 'a,b', 'return a in b' );\r
+\r
+\r
+// ------------------------------------------------------------------------- //\r
+// --- interface ----------------------------------------------------------- //\r
+// ------------------------------------------------------------------------- //\r
 \r
 /**\r
  * Object に関するメソッドを集めたものです。\r
  * @namespace X.Object\r
  * @alias X.Object\r
  */\r
-X.Object = {\r
+X[ 'Object' ] = {\r
        // TODO rename to copy\r
-       clone      : X_Object_clone,\r
+       'clone'      : X_Object_clone,\r
        \r
-       override   : X_Object_override,\r
+       'override'   : X_Object_override,\r
        \r
-       deepCopy   : X_Object_deepCopy,\r
+       'deepCopy'   : X_Object_deepCopy,\r
        \r
        // TODO rename to X.Array.copy\r
-       cloneArray : X_Object_cloneArray,\r
+       'cloneArray' : X_Object_cloneArray,\r
        \r
-       isEmpty    : X_Object_isEmpty,\r
+       'isEmpty'    : X_Object_isEmpty,\r
        \r
-       inObject   : X_Object_inObject\r
+       'inObject'   : X_Object_inObject\r
        \r
        // TODO hasOwnProperty\r
 };\r
 \r
+// ------------------------------------------------------------------------- //\r
+// --- implements ---------------------------------------------------------- //\r
+// ------------------------------------------------------------------------- //\r
 /**\r
- * 単純なクローンでメンバーをコピーしたオブジェクトを返します。\r
+ * 単純なクローンでメンバーをコピーしたオブジェクトを返します。 k in null でエラーになる Opera7- に対策済。\r
  * @alias X.Object.clone\r
  * @param {object|Array} src コピー元のオブジェクトです。\r
  * @return {object|Array}\r
  */\r
 function X_Object_clone( src ){\r
        var ret, k;\r
-       if( typeof src !== 'object' ) return src;\r
+       \r
+       if( !src || !X_Type_isObject( src ) ) return src;\r
+       \r
        ret = {};\r
        for( k in src ){\r
                //if( X_EMPTY_OBJECT[ k ] ) continue;\r
@@ -68,7 +77,7 @@ function X_Object_clone( src ){
  */\r
 function X_Object_override( target, src ){\r
        var k;\r
-       if( !X.Type.isObject( src ) ) return target;\r
+       if( !src || !X_Type_isObject( src ) ) return target;\r
        for( k in src ){\r
                //if( X_EMPTY_OBJECT[ k ] ) continue;\r
                target[ k ] = src[ k ];\r
@@ -89,16 +98,17 @@ function X_Object_deepCopy( src ){
 \r
 function X_Object_deepCopy_( src, objSrc, objCopy, n ) {\r
        var ret, i, k;\r
+       \r
        if( !src ){ // 0, "", null, undefined, NaN, false\r
                return src;\r
        } else\r
-       if( X.Type.isArray( src ) ){\r
+       if( X_Type_isArray( src ) ){\r
                i = objSrc.indexOf( src );\r
                if( i !== -1 ) return objCopy[ i ];\r
                objSrc[ ++n ] = src;\r
                objCopy[ n ]  = ret = [];\r
        } else\r
-       if( X.Type.isObject( src ) ){\r
+       if( X_Type_isObject( src ) ){\r
                i = objSrc.indexOf( src );\r
                if( i !== -1 ) return objCopy[ i ];\r
                objSrc[ ++n ] = src;\r
@@ -109,7 +119,7 @@ function X_Object_deepCopy_( src, objSrc, objCopy, n ) {
        };\r
        for( k in src ){\r
                //if( X_EMPTY_OBJECT[ k ] ) continue;\r
-               ret[ k ] = clone( src[ k ], objSrc, objCopy, n );\r
+               ret[ k ] = X_Object_deepCopy_( src[ k ], objSrc, objCopy, n );\r
        };\r
        return ret;\r
 };\r
@@ -123,6 +133,7 @@ function X_Object_deepCopy_( src, objSrc, objCopy, n ) {
 function X_Object_cloneArray( ary ){\r
        var ret = [],\r
                i = ary.length;\r
+\r
        if( !i ) return ret;\r
        for( ; i; ){\r
                ret[ --i ] = ary[ i ];\r
@@ -131,15 +142,15 @@ function X_Object_cloneArray( ary ){
 };\r
 \r
 /**\r
- * object が空か?調べます。\r
+ * object が空か?調べます。 object でない場合、undefined が返る\r
  * @alias X.Object.isEmpty\r
  * @param {object} v \r
- * @return {boolean}\r
+ * @return {boolean|undefined}\r
  */\r
 function X_Object_isEmpty( v ){\r
-       var k;\r
-       for( k in v ){\r
-               //if( X_EMPTY_OBJECT[ k ] ) continue;\r
+       if( !v ) return;\r
+       for( var k in v ){\r
+               //if( X_EMPTY_OBJECT[ _k ] ) continue;\r
                return false;//if( v.hasOwnProperty && v.hasOwnProperty( p ) ) return false; ie4 で動かない、、、\r
        };\r
        return true;\r