ãã®ã»ã¯ã·ã§ã³ã®æåã®æåã®ç« ã§ã¯ããããã¿ã¤ã ãã»ããã¢ããããç¾ä»£ã®ã¡ã½ããã説æãã¾ãã
__proto__ ã¯å¤ãããã鿍奍ã¨ããã¦ãã¾ãï¼JavaScriptæ¨æºã®ãã©ã¦ã¶ã®ã¿ã®é¨åã§ï¼ã
ç¾ä»£ã®ã¡ã½ããã¯æ¬¡ã®ãã®ã§ã:
- Object.create(proto[, descriptors]) â ä¸ãããã
protoã[[Prototype]]ã¨ãã¦ãã¾ãä»»æã®ããããã£ãã£ã¹ã¯ãªãã¿ã§ç©ºã®ãªãã¸ã§ã¯ããä½ãã¾ãã - Object.getPrototypeOf(obj) â
objã®[[Prototype]]ãè¿ãã¾ãã - Object.setPrototypeOf(obj, proto) â
objã®[[Prototype]]ã«protoãã»ãããã¾ãã
ããã㯠__proto__ ã®ä»£ããã«ä½¿ç¨ãã¾ãã
ä¾:
let animal = {
eats: true
};
// animal ããããã¿ã¤ãã¨ãã¦æ°ãããªãã¸ã§ã¯ãã使ãã
let rabbit = Object.create(animal);
alert(rabbit.eats); // true
alert(Object.getPrototypeOf(rabbit) === animal); // rabbit ã®ãããã¿ã¤ããåå¾
Object.setPrototypeOf(rabbit, {}); // rabbit ã®ãããã¿ã¤ãã {} ã«å¤æ´
Object.create ã¯ä»»æã§2ã¤ç®ã®å¼æ°ãæã¡ãããã¯ããããã£ãã£ã¹ã¯ãªãã¿ã§ããæ¬¡ã®ããã«ãæ°ãããªãã¸ã§ã¯ãã«è¿½å ã®ããããã£ãæå®ã§ãã¾ã :
let animal = {
eats: true
};
let rabbit = Object.create(animal, {
jumps: {
value: true
}
});
alert(rabbit.jumps); // true
ãã£ã¹ã¯ãªãã¿ã¯ãã£ãã¿ã¼ ããããã£ãã©ã°ã¨ãã£ã¹ã¯ãªãã¿ ã§èª¬æããã®ã¨åããã©ã¼ãããã§ãã
for..in ã§ããããã£ãã³ãã¼ããããããããå¼·åã«ãªãã¸ã§ã¯ããã¯ãã¼ã³ããã®ã« Object.create ã使ç¨ã§ãã¾ãã:
let clone = Object.create(Object.getPrototypeOf(obj), Object.getOwnPropertyDescriptors(obj));
ãã®å¼ã³åºãã¯ãã¹ã¦ã®ããããã£ãå«ã obj ã®æ¬å½ã®æ£ç¢ºãªã³ãã¼ãä½ãã¾ãã: åæåãéåæåããã¼ã¿ããããã£ãsetter/getter â ãã¹ã¦ã¨ãæ£ç¢ºãª [[Prototype]] ã§ãã
ç¥å²
[[Prototype]] ã管çããæ¹æ³ã¯ããããããã¾ã! åããã¨ãããããããã®æ¹æ³ãããã¾ã!
ãªãã§ãããï¼
ããã¯æ´å²çãªçç±ã«ãããã®ã§ãã
- ã³ã³ã¹ãã©ã¯ã¿é¢æ°ã®
"prototype"ããããã£ã¯ã¨ã¦ãå¤ãããæ©è½ãã¦ãã¾ãã - 2012å¹´å¾å:
Object.createãæ¨æºã«ç»å ´ãã¾ãããããã¯ä¸ãããããããã¿ã¤ãã§ãªãã¸ã§ã¯ããä½ãã¾ããããããåå¾/è¨å®ãããã¨ã¯ã§ãã¾ããã§ããããã®ããããã©ã¦ã¶ã¯ãã¤ã§ããããã¿ã¤ãã®åå¾/è¨å®ãã§ãã鿍æºã®__proto__ã¢ã¯ã»ãµãå®è£ ãã¾ããã - 2015å¹´å¾å:
Object.setPrototypeOfã¨Object.getPrototypeOfãæ¨æºã«è¿½å ããã¾ããã__proto__ã¯ã©ãã§ãå®è¡ããã¦ããããã¡ã¯ãã§ãã£ããããæ¨æºã®ä»é²Bã«è¿½å ããã¦ãã¾ããããã¯ãã©ã¦ã¶ä»¥å¤ã®ç°å¢ã§ã¯ãªãã·ã§ã³ã§ãã
ä»ç¾å¨ãç§ãã¡ã¯ãããã®ãã¹ã¦ã®æ¹æ³ãèªç±ã«ä½¿ããã¨ãã§ãã¾ãã
ãªã __proto__ ã¯é¢æ° getPrototypeOf/setPrototypeOf ã«ç½®ãæããããã®ã§ããããï¼ããã¯è峿·±ã質åã§ããããªã __proto__ ã§ã¯ãã¡ãªã®ããçè§£ããå¿
è¦ãããã¾ããçããç¥ãã«ã¯ç¶ããèªãã§ãã ããã
[[Prototype]] ã夿´ããªãã§ãã ããæè¡çã«ã¯ããã¤ã§ã [[Prototype]] ã®åå¾/è¨å®ãå¯è½ã§ããããããé常ã¯ãªãã¸ã§ã¯ã使æã«ä¸åº¦ã ãè¨å®ãè¡ãã夿´ã¯ãã¾ãããrabbit 㯠animal ããç¶æ¿ãã¦ãããããã¯å¤æ´ãã¾ããã
ã¾ããJavaScriptã¨ã³ã¸ã³ã¯é«åº¦ã«æé©åããã¦ãã¾ããObject.setPrototypeOf ã¾ã㯠obj.__proto__= ã§ âãã®å ´ã§â ãããã¿ã¤ãã夿´ãããã¨ã¯ãå¯è½ã§ããã¨ã¦ãé
ãæä½ã«ãªãã¾ãããã®ãããä½ããããã¨ãã¦ãããããã£ã¦ããå ´åãã¾ã㯠JavaScript ã®é度ãå
¨ãåé¡ã«ãªããªãå ´å以å¤ã¯é¿ãã¦ãã ããã
âé常ã«ã·ã³ãã«ãªâ ãªãã¸ã§ã¯ã
ãåç¥ã®éãããªãã¸ã§ã¯ãã¯ãã¼/å¤ãã¢ãæ ¼ç´ããããã®é£æ³é åã¨ãã¦ä½¿ããã¨ãã§ãã¾ãã
â¦ãããããããã®ä¸ã§ ã¦ã¼ã¶ããæä¾ããã ãã¼ãæ ¼ç´ãããã¨ããå ´å(ä¾ãã°ã¦ã¼ã¶ãå
¥åããè¾æ¸)ãè峿·±ãåé¡ãèµ·ããã¾ãã: ãã¹ã¦ã®ãã¼ã¯ "__proto__" ãé¤ãã¦ãã¾ãåä½ãã¾ãã
ä¾ã確èªãã¦ã¿ã¾ããã:
let obj = {};
let key = prompt("What's the key?", "__proto__");
obj[key] = "some value";
alert(obj[key]); // [object Object], "some value" ã§ã¯ããã¾ãã!
ããã§ã¯ãã¦ã¼ã¶ã __proto__ ãå
¥åããå ´åããã®ä»£å
¥ã¯ç¡è¦ããã¾ã!
ããã¯é©ããã¨ã§ã¯ããã¾ããã__proto__ ããããã£ã¯ç¹å¥ã§ã: ããã¯ãªãã¸ã§ã¯ãã¾ã㯠null ã§ãããæååã¯ãããã¿ã¤ãã«ã¯ãªãã¾ããã
ãããããã®ãããªæ¯ãèããå®è£
ããã¤ããã¯ããã¾ããã§ãããç§ãã¡ã¯ãã¼/å¤ãã¢ãæ ¼ç´ãããã§ããããã¼åã "__proto__" ã®å ´åã¯æ£ããä¿åããã¾ããã§ããããªã®ã§ãããã¯ãã°ã§ãã
ããã§ã®çµæã¯ã²ã©ãã¯ããã¾ããããä»ã®ã±ã¼ã¹ã§ã¯ããããã¿ã¤ãã¯å®éã«å¤æ´ãããå¯è½æ§ããããããå¦çãäºæããªãæ¹åã§ééã£ã¦ãã¾ãå¯è½æ§ãããã¾ãã
ææªãªã®ã¯ãé常éçºè ã¯ãã®ãããªå¯è½æ§ã«ã¤ãã¦å ¨ãèãã¾ããããã®ããããã®ãããªãã°ã«æ°ä»ãã«ãããªããç¹ã«JavaScriptããµã¼ãã¼å´ã§ä½¿ç¨ããã¦ããå ´åã«ã¯ãããããèå¼±æ§ã«å¤ãããã¨ããããã¾ãã
ã¾ããããã©ã«ãã®é¢æ°ã§ãããtoString ãä»ã®çµã¿è¾¼ã¿ã¡ã½ããã«ä»£å
¥ããå ´åãäºæããªããã¨ãèµ·ããå¯è½æ§ãããã¾ãã
ã©ããã£ã¦ãã®åé¡ãåé¿ãã¾ãããï¼
ã¾ããé常ã®ãªãã¸ã§ã¯ãã®ä»£ããã«ãæ ¼ç´åã¨ã㦠Map ã使ç¨ããããåãæ¿ããæ¹æ³ãããã¾ããããã§ãã¹ã¦åé¡ããã¾ããã
ã§ãããObject ãã¾ãããã§ã¯ä¸æãæ©è½ãã¾ã
__proto__ ã¯ãªãã¸ã§ã¯ãã®ããããã£ã§ã¯ãªããObject.prototype ã®ã¢ã¯ã»ãµããããã£ã§ãã:
ãªã®ã§ããã obj.__proto__ ãèªã¿è¾¼ã¾ããã代å
¥ãããå ´åã該å½ã® getter/setter ããã®ãããã¿ã¤ãããå¼ã°ãããã㯠[[Prototype]] ã®åå¾/è¨å®ããã¾ãã
æåã«è¨ã£ãã¨ããã__proto__ 㯠[[Prototype]] ã«ã¢ã¯ã»ã¹ããæ¹æ³ã§ããã[[Prototype]] èªèº«ã§ã¯ããã¾ããã
ä»ã飿³é åã¨ãã¦ãªãã¸ã§ã¯ãã使ãããå ´åããªãã©ã«ã®ããªãã¯ã使ã£ã¦ãããè¡ãäºãã§ãã¾ãã:
let obj = Object.create(null);
let key = prompt("What's the key?", "__proto__");
obj[key] = "some value";
alert(obj[key]); // "some value"
Object.create(null) ã¯ãããã¿ã¤ããªã([[Prototype]] ã null)ã®ç©ºãªãã¸ã§ã¯ããä½ãã¾ãã:
ãããã£ã¦ã__proto__ ã«å¯¾ããç¶æ¿ããã getter/setter ã¯ããã¾ãããä»ãé常ã®ãã¼ã¿ããããã£ã¨ãã¦å¦çããã¾ãã®ã§ãä¸ã®ä¾ã¯æ£ããåä½ãã¾ãã
ãã®ãããªãªãã¸ã§ã¯ãã âé常ã«ã·ã³ãã«ãªâ ã¾ã㯠âç´ç²ãªè¾æ¸ãªãã¸ã§ã¯ãâ ã¨å¼ã³ã¾ãããªããªãããããã¯é常ã®ãªãã¸ã§ã¯ã {...} ãããã·ã³ãã«ãªããã§ãã
æ¬ ç¹ã¯ããã®ãããªãªãã¸ã§ã¯ãã«ã¯çµã¿è¾¼ã¿ã®ãªãã¸ã§ã¯ãã¡ã½ããããªããã¨ã§ãã toString ãªã©:
let obj = Object.create(null);
alert(obj); // Error (no toString)
â¦ãããã飿³é åã§ã¯ããã¯é常åé¡ããã¾ããã
ã»ã¨ãã©ã®ãªãã¸ã§ã¯ãã«é¢é£ããã¡ã½ãã㯠Object.keys(obj) ã®ããã« Object.something(...) ã§ãããã¨ã«æ³¨ç®ãã¦ãã ããããããã¯ãããã¿ã¤ãã«ã¯ãªãã®ã§ããã®ãããªãªãã¸ã§ã¯ãã§æ©è½ãç¶ãã¾ãã:
let chineseDictionary = Object.create(null);
chineseDictionary.hello = "ni hao";
chineseDictionary.bye = "zai jian";
alert(Object.keys(chineseDictionary)); // hello,bye
ãµããª
ãããã¿ã¤ããã»ããã¢ãããããç´æ¥ã¢ã¯ã»ã¹ããããã®ç¾ä»£ã®ã¡ã½ããã¯æ¬¡ã®éãã§ã:
- Object.create(proto[, descriptors]) â ä¸ãããã
protoã[[Prototype]](nullãOK)ã¨ãã¦ãã¾ãä»»æã®ããããã£ãã£ã¹ã¯ãªãã¿ã§ç©ºã®ãªãã¸ã§ã¯ããä½ãã¾ãã - Object.getPrototypeOf(obj) â
objã®[[Prototype]]ãè¿ãã¾ã(__proto__ã® getter ã¨åãã§ã)ã - Object.setPrototypeOf(obj, proto) â
objã®[[Prototype]]ã«protoãã»ãããã¾ã(__proto__ã® setter ã¨åãã§ã)ã
çµã¿è¾¼ã¿ã® __proto__ ã® getter/setter ã¯ã¦ã¼ã¶ã使ãããã¼ããªãã¸ã§ã¯ãã«å
¥ããå ´åã«å®å
¨ã§ã¯ããã¾ãããã¦ã¼ã¶ããã¼ã¨ã㦠"__proto__" ãå
¥åããå¯è½æ§ãããããã®å ´åã¨ã©ã¼ãçºçããé常ã¯äºæãã¬çµæã«ãªãã§ãããã
ãªã®ã§ãObject.create(null) ã使ç¨ã㦠__proto__ ããããªã âé常ã«ã·ã³ãã«ãªâ ãªãã¸ã§ã¯ãã使ããããMap ãªãã¸ã§ã¯ãã使ç¨ãã¾ãã
ã¾ããObject.create ã¯ãªãã¸ã§ã¯ãã®ãã¹ã¦ã®ãã£ã¹ã¯ãªãã¿ã®æµ
ãã³ãã¼ï¼shallow-copyï¼ã使ããç°¡åãªæ¹æ³ã§ãã
let clone = Object.create(Object.getPrototypeOf(obj), Object.getOwnPropertyDescriptors(obj));
ããã«ã__proto__ 㯠[[Prototype]] ã® getter/setterã§ãããä»ã®ã¡ã½ããã¨åæ§ã« Object.prototype ã«åå¨ãããã¨ãæããã«ãã¾ããã
ç§ãã¡ã¯ãObject.create(null) ã«ãã£ã¦ãããã¿ã¤ããªãã®ãªãã¸ã§ã¯ããä½ããã¨ãã§ãã¾ãããã®ãããªãªãã¸ã§ã¯ã㯠âç´ç²ãªè¾æ¸â ã¨ãã¦ä½¿ããããã¼ã¨ã㦠"__proto__" ã®åé¡ã¯ããã¾ããã
ä»ã®ã¡ã½ããã§ã:
- Object.keys(obj) / Object.values(obj) / Object.entries(obj) â åæå¯è½ãªèªèº«ã®æååããããã£å/å¤/ãã¼å¤ãã¢ã®é åãè¿ãã¾ãã
- Object.getOwnPropertySymbols(obj) â ãã¹ã¦ã®èªèº«ã®ã·ã³ããªãã¯ããããã£åã®é åãè¿ãã¾ãã
- Object.getOwnPropertyNames(obj) â ãã¹ã¦ã®èªèº«ã®æååããããã£åãè¿ãã¾ãã
- Reflect.ownKeys(obj) â ãã¹ã¦ã®èªèº«ã®ããããã£åã®é åãè¿ãã¾ãã
- obj.hasOwnProperty(key): ããã¯
objèªèº«ãkeyã¨ããååã®ããããã£ããã¤(ç¶æ¿ã§ãªã) å ´åã«trueãè¿ãã¾ãã
ãªãã¸ã§ã¯ãããããã£(Object.keys ãªã©)ãè¿ããã¹ã¦ã®ã¡ã½ãã㯠âèªèº«ã®â ããããã£ãè¿ãã¾ããããç¶æ¿ããããã®ã欲ããå ´åã¯ãfor..in ã使ãã¾ãã
ã³ã¡ã³ã
<code>ã¿ã°ã使ã£ã¦ãã ãããè¤æ°è¡ã®å ´åã¯<pre>ãã10è¡ãè¶ ããå ´åã«ã¯ãµã³ãããã¯ã¹ã使ã£ã¦ãã ãã(plnkr, JSBin, codepenâ¦)ã