* @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, p ){\r
- if( obj[ name ] ) return true; // quick\r
+var X_Object_inObject = !X_Script_gte15 ? // TODO JScript で判定\r
+ (function( name, obj, _ ){\r
name += ''; // 数値も許可\r
- for( p in obj ){\r
- if( p === name ) return true;\r
+ if( obj[ name ] ) return true; // quick\r
+ for( _ in obj ){\r
+ if( _ === name ) return true;\r
};\r
return false;\r
}) :\r
return obj;\r
};\r
\r
+// TODO X.Object.own( obj, name )\r
+/*\r
+ * Safari の JavaScript の不備 \r
+ * http://nanto.asablo.jp/blog/2006/01/13/209495\r
+ * \r
+ * web.paulownia.jp - JavaScriptとクロージャ\r
+ * https://web.archive.org/web/20070526063400/http://web.paulownia.jp/script/oop/closure.html\r
+ * MacOSX 10.3のsafariにはhasOwnPropertyが実装されていないので、独自に追加する必要があります。\r
+ * \r
+ * prototype汚染問題でhasOwnPropertyを使わないクロスブラウザな方法\r
+ * http://os0x.hatenablog.com/entry/20080901/1220272509\r
+ */\r
+/*\r
+Object.prototype.hasOwnProperty || (Object.prototype.hasOwnProperty = function( p ){\r
+ var proto = this.constructor && this.constructor.prototype,\r
+ __p__ = proto && proto.__proto__,\r
+ v = this[ p ],\r
+ r = false;\r
+ \r
+ if( __p__ ) proto.__proto__ = null;\r
+ \r
+ if( p in this ){\r
+ if( v !== v ){\r
+ if( proto && ( p in proto ) && proto[ p ] !== proto[ p ] ){ // proto[ p ] is NaN\r
+ proto[ p ] = 0; // different value\r
+ r = this[ p ] !== this[ p ]; // isNaN?\r
+ proto[ p ] = v; // set NaN\r
+ } else {\r
+ r = true;\r
+ };\r
+ } else\r
+ if( proto && p in proto && proto[ p ] === v ){\r
+ // this と proto に同名で同値が書かれている可能性あり\r
+ proto[ p ] = v + ' '; // different value\r
+ r = v === this[ p ];\r
+ proto[ p ] = v;\r
+ } else {\r
+ r = true;\r
+ };\r
+ };\r
+ \r
+ if( __p__ ) proto.__proto__ = __p__;\r
+ \r
+ return r;\r
+ }); */\r
+/*\r
+Object.prototype.hasOwnProperty || (Object.prototype.hasOwnProperty = function( p ){\r
+ var proto = this.constructor && this.constructor.prototype,\r
+ __p__ = proto && proto.__proto__,\r
+ r = false,//!!( __p__ && ( proto.__proto__ = null ) )\r
+ _pro_, v, isNaN;\r
+ \r
+ if( __p__ ) proto.__proto__ = null;\r
+ if( this.__proto__ ){\r
+ _pro_ = this.__proto__;\r
+ this.__proto__ = null;\r
+ };\r
+ \r
+ if( p === '__proto__' ){\r
+ r = !!_pro_;\r
+ } else {\r
+ v = this[ p ];\r
+ isNaN = v !== v; \r
+ \r
+ if( p in this ){\r
+ if( proto && p in proto && ( proto[ p ] === v ) ^ isNaN ){ //true + false, false + true\r
+ // this と proto に同名で同値が書かれている可能性あり\r
+ proto[ p ] = v + ' '; // different value\r
+ r = ( v === this[ p ] ) ^ isNaN; // true + false, false + true\r
+ proto[ p ] = v;\r
+ } else {\r
+ r = true;\r
+ };\r
+ }; \r
+ };\r
+\r
+ if( __p__ ) proto.__proto__ = __p__;\r
+ if( _p_ ) this.__proto__ = _pro_;\r
+ return r;\r
+ }); */\r
+ \r
+ \r
+\r