JavaScript ã®ãªãã¸ã§ã¯ãã®ããããã£ä¸è¦§ãåå¾ããæ¹æ³ã¨ãªãã¸ã§ã¯ããæå®ã®ååã®ããããã£ããã£ã¦ãããæ¤æ»ããæ¹æ³
JavaScript ã®ãªãã¸ã§ã¯ããããååã®ããããã£ããã£ã¦ããã®ãã©ãã調ã¹ãæ¹æ³ãããªãã¸ã§ã¯ãããã£ã¦ããããããã£ã®ååã®ä¸è¦§ãåå¾ããæ¹æ³ã¯ããã¤ã種é¡ããã£ã¦ãããããã©ããããã®ã ã£ããã¡ããã¨è¦ãã¦ãªãã£ãã®ã§ã¾ã¨ãã¦ã¿ã¾ããã åºæ¬çã« data property ã accessor property ãã¨ããã®ã¯ãããããã£ã®åå¨ã調ã¹ãéãããããã£ã®ååã®ä¸è¦§ãåå¾ããéã«ã¯é¢ä¿ãªãã®ã§ãã ããããã£ã®ååä¸è¦§ãåæããã¨ãã«ã¯ãããããã£ã enumerable ãã©ããã¨ããã®ã¯é¢ä¿ãã¾ãã *1
ECMA-262 5.1 ãåç §ãã¦ã¾ã¨ãã¾ããã
ãªãã¸ã§ã¯ããæå®ã®ããããã£ããã£ã¦ãããã©ããã®æ¤æ»
ãªãã¸ã§ã¯ãããæå®ã®ååã®ããããã£ããã£ã¦ãããã©ãã調ã¹ãæ¹æ³ã
in æ¼ç®å
var obj1 = { a: 200 }; var obj2 = Object.create( obj1 ); // obj2 ã¯ãããã¿ã¤ãã« obj1 ããã¤ãªãã¸ã§ã¯ã "a" in obj1; //=> true "a" in obj2; //=> true
in æ¼ç®åã®å³è¾ºã示ããªãã¸ã§ã¯ãã«å·¦è¾ºã表ãååã®ããããã£ãåå¨ãããã©ããã調ã¹ããã®ã èªèº«ã«ããããã£ãå®ç¾©ããã¦ããªãã¦ãããããã¿ã¤ãã«å®ç¾©ããã¦ããã° true ãè¿ãã¦ããã¾ãã ããããã£ã® enumerable 屿§ã false ã§ãã£ã¦ããtrue ãè¿ãã¦ããã¾ãã for-in ã«ã¼ãã® in ã¨ååãåãã§æ··åããããã®ã§æ³¨æ *2ã
Object.prototype.hasOwnProperty ã¡ã½ãã
// obj1 㨠obj2 ã¯ä¸è¨ã®ãã® obj1.hasOwnProperty( "a" ); //=> true obj2.hasOwnProperty( "a" ); //=> false
in æ¼ç®åããããã¿ã¤ããã§ã¤ã³ã®ä¸æµãèæ
®ãã䏿¹ã§ããã¡ãã¯ãã®ãªãã¸ã§ã¯ãèªèº«ãæå®ãããååã®ããããã£ããã£ã¦ããªããã° false ãè¿ãã¾ãã ãã®ä»ã®ç´°ããªéãã¨ãã¦ã¯ã"test" in 100
㯠TypeError ã«ãªã䏿¹ã§ãObject.prototype.hasOwnProperty.call( 100, "test" )
ã¯ä¾å¤ãæããªããã¨ããã®ãããã¾ãã
ãªãã¸ã§ã¯ãããã£ã¦ããããããã£ã®åæ
ãªãã¸ã§ã¯ãããã£ã¦ããããããã£ã®ä¸è¦§ãå¾ãæ¹æ³ã
for-in æ
Object.defineProperties( obj1, { "b": { value: 200, enumerable: true }, "c": { value: 300, enumerable: false } } ); for ( var n in obj1 ) { // ... } //=> "a", "b" ãã«ã¼ãã«ç¾ãã for ( var n in obj2 ) { // ... } //=> "a", "b" ãã«ã¼ãã«ç¾ãã
enumerable ãªããããã£ãå ¨ã¦ã«ã¼ãã§åæãã¦ããã¾ãã ãããã¿ã¤ããã§ã¤ã³ã®ä¸ã®ãªãã¸ã§ã¯ãã®ããããã£ãå«ã¿ã¾ã *3ã ã«ã¼ãä¸ã«ããããã£åãç¾ããé çªã¯ãECMA-262 5.1 ã§ã¯æå®ããã¦ãã¾ããã ã«ã¼ãä¸ã§åé¤ãããããããã£ã¯ã(ãã®ããããã£ãã¾ã ç¾ãã¦ããªããªãã°) ã«ã¼ãä¸ã«åºç¾ãããã¨ã¯ãªããã¾ããã«ã¼ãä¸ã«è¿½å ãããããããã£ãå¿ ãã«ã¼ãä¸ã«åºç¾ãããã¨ã¯ä¿è¨¼ããã¾ããã
Object.keys ã¡ã½ãã
// obj1, obj2 ã¯ä¸ã®ä¾ã¨åã Object.keys( obj1 ); //=> [ "a", "b" ] Object.keys( obj2 ); //=> []
èªèº«ããã£ã¦ãã (ãããã¿ã¤ãããã£ã¦ãã¦ãã ã)ãã㤠enumerable ãªããããã£ã®ååä¸è¦§ãæ ¼ç´ãããé å (Array ãªãã¸ã§ã¯ã) ãè¿ãã¦ããã¾ãã
Object.getOwnPropertyNames ã¡ã½ãã
// obj1, obj2 ã¯ä¸ã®ä¾ã¨åã Object.getOwnPropertyNames( obj1 ); //=> [ "a", "b", "c" ] Object.getOwnPropertyNames( obj2 ); //=> []
ãªãã¸ã§ã¯ãèªèº«ããã£ã¦ãããããã㣠(ãããã¿ã¤ãããã£ã¦ãã¦ãã ã) ã®ååä¸è¦§ãæ ¼ç´ãããé å (Array ãªãã¸ã§ã¯ã) ãè¿ãã¦ããã¾ãã
ãããªãã¸ã§ã¯ããå¿çã§ããå ¨ã¦ã®ããããã£åã®åæ
ãããã¦ã¿ãã¨ããããªãã¸ã§ã¯ããå¿çã§ããå ¨ã¦ã®ããããã£å (ãªãã¸ã§ã¯ãèªèº«ãããã®ãããã¿ã¤ããã§ã¤ã³ä¸ã®ãªãã¸ã§ã¯ãããã£ã¦ããããããã£åä¸è¦§) ãè¿ããããªã¡ã½ããã£ã¦ ECMA-262 5.1 ã«ã¯å«ã¾ãã¦ããªãã½ãã§ããã ãããããã®ãåå¾ããæ¹æ³ã¨ãã¦ã¯ã以ä¸ã®ããã«ãããã¿ã¤ããé¡ã£ã¦ããã¨ããæ¹æ³ãããã¾ãã (ãã®æ¹æ³ã ã¨ãåãååã®ããããã£ããããã¿ã¤ããªãã¸ã§ã¯ããæã£ã¦ããå ´åã«ãçµæã«åãååãè¤æ°åå«ã¾ãã¦ãã¾ãã®ã§ã注æãã ããã)
var propNames = []; var o = obj2; while ( o ) { propNames = propNames.concat( Object.getOwnPropertyNames( o ) ); o = Object.getPrototypeOf( o ); } propNames; //=> [ "a", "b", "c", "constructor", "toSource", "toString", "toLocaleString", "valueOf", "watch", // "unwatch", "hasOwnProperty", "isPrototypeOf", "propertyIsEnumerable", "__defineGetter__", // "__defineSetter__", "__lookupGetter__", "__lookupSetter__" ] // ãã®çµæã¯ Firefox 12.0 ã®å ´å
*1:accessor property ã enumerable ã«ã¤ãã¦ã¯ ãJavaScript ã«æ°ããå°å ¥ããã accessor property ã«ã¤ãã¦ã ã¨ã ãECMA-262 5th edition ã§å°å ¥ããã Object.defineProperty ã使ãã屿§ãæå®ãã¦ããããã£ãå®ç¾©ããã ã¨ããã覧ãã ãã
*2:enumerable 屿§ã false ã®ããããã£ã¯ãfor in ã«ã¼ãã§åæãããªã
*3:ãã ãããããã¿ã¤ããã§ã¤ã³ã®ä¸ã®åãååã®ããããã£ããã£ã¦ããªãå ´åã«éã