ããã°ã©ãã³ã°ã§ã¯ãä½ããåå¾ããããæ¡å¼µãããã¨ããã°ãã°ããã¾ãã
ä¾ãã°ãããããã£ã¨ã¡ã½ãããã㤠user ãªãã¸ã§ã¯ããããã¨ãã¾ããããã¦ããã®ããã¤ããå
ãã«å¤æ´ãã admin ã guest ãä½ãããã¨ãã¾ããã¡ã½ããã®ã³ãã¼ãåå®è£
ã§ã¯ãªããåã«ãã®ä¸ã«æ°ãããªãã¸ã§ã¯ãã使ãããã¨ã§ãuser ãæã£ã¦ãããã®ãåå©ç¨ãããã§ãã
ãããã¿ã¤ãç¶æ¿ ã¯ãããå©ããè¨èªã®æ©è½ã§ãã
ãããã¿ã¤ã [[Prototype]]
JavaScriptã§ã¯ããªãã¸ã§ã¯ãã¯ç¹å¥ãªé ããããã㣠[[Prototype]] ï¼ã¹ããã¯ã«ã¦å½åããã¦ãã¾ãï¼ãæã£ã¦ããããã㯠null ã¾ãã¯å¥ã®ãªãã¸ã§ã¯ããåç
§ãã¾ãããã®ãªãã¸ã§ã¯ã㯠âãããã¿ã¤ãâ ã¨å¼ã°ãã¾ãã
object ããããããã£ãèªãã ã¨ãã«åå¨ããªãå ´åãJavaScriptã¯èªåçã«ãããã¿ã¤ããããããåå¾ãã¾ããããã°ã©ãã³ã°ã§ã¯ãã®ãããªãã¨ã âãããã¿ã¤ãç¶æ¿â ã¨å¼ã³ã¾ããå¤ãã®ã¯ã¼ã«ãªè¨èªæ©è½ãããã°ã©ãã³ã°ãã¯ããã¯ã¯ãããããã¼ã¹ã«ãªã£ã¦ãã¾ãã
ãããã㣠[[Prototype]] ã¯å
é¨ã§ããé ããã¦ãã¾ãããã»ããããå¤ãã®æ¹æ³ãããã¾ãã
ãããã®ï¼ã¤ã¯ã次ã®ããã« __proto__ ãä½¿ãæ¹æ³ã§ã:
let animal = {
eats: true
};
let rabbit = {
jumps: true
};
rabbit.__proto__ = animal; // rabbit.[[Prototype]] = animal ãã»ãã
rabbit ã®ããããã£ãèªãã¨ãã«ããããªãå ´åãJavaScriptã¯èªåã§ animal ããåå¾ãã¾ãã
ä¾:
let animal = {
eats: true
};
let rabbit = {
jumps: true
};
rabbit.__proto__ = animal; // (*)
// ä»ãrabbit ã§ä¸¡æ¹ã®ããããã£ãè¦ã¤ãããã¨ãã§ãã¾ã:
alert( rabbit.eats ); // true (**)
alert( rabbit.jumps ); // true
ããã§ãè¡ (*) 㯠rabbit ã®ãããã¿ã¤ãã« animal ãã»ãããã¦ãã¾ãã
次ã«ãalert ããããã㣠rabbit.eats (**) ãèªããã¨ããã¨ãããã㯠rabbit ã«ã¯ãªãã®ã§ãJavaScript㯠[[Prototype]] åç
§ã«å¾ã£ã¦ãanimal ã®ä¸ã§ãããè¦ã¤ãã¾ã(ä¸ããä¸ã«åããã¾ã)ã
ããã§ã¯ãç§ãã¡ã¯ âanimal 㯠rabbit ã®ãããã¿ã¤ãâ ã¾ã㯠ârabbit ããããã¿ã¤ãçã« animal ãç¶æ¿ãã¦ããâ ã¨ããäºãã§ãã¾ãã"
ãããã£ã¦ããã animal ãå¤ãã®å½¹ç«ã¤ããããã£ãã¡ã½ãããæã£ã¦ããå ´åããããã¯èªåçã« rabbit ã§ãå©ç¨å¯è½ã«ãªãã¾ãããã®ãããªããããã£ã¯ âç¶æ¿â ã¨å¼ã°ãã¾ãã
ãã animal ãã¡ã½ãããæã£ã¦ããå ´åãrabbit ã§ããããå¼ã¶ãã¨ãã§ãã¾ã:
let animal = {
eats: true,
walk() {
alert("Animal walk");
}
};
let rabbit = {
jumps: true,
__proto__: animal
};
// walk 㯠prototype ããå¾ããã¾ãã
rabbit.walk(); // Animal walk
ã¡ã½ããã¯æ¬¡ã®ããã«èªåçã«ãããã¿ã¤ãããåããã¾ãã:
ãããã¿ã¤ããã§ã¼ã³ã¯é·ãã¦ãåé¡ããã¾ããã:
let animal = {
eats: true,
walk() {
alert("Animal walk");
}
};
let rabbit = {
jumps: true,
__proto__: animal
};
let longEar = {
earLength: 10,
__proto__: rabbit
};
// walk 㯠prototype ãã§ã¼ã³ããåããã¾ãã
longEar.walk(); // Animal walk
alert(longEar.jumps); // true (rabbit ãã)
ããã§ longEar ããä½ããããèªã¿åããã¨ãã¦ããããè¦ã¤ãããªãã£ãå ´åãJavaScript ã¯ã¾ã rabbitãæ¬¡ã« animal ã®é ã«æ¢ãã«è¡ãã¾ãã
å®éã«ã¯ã2ã¤ã®å¶éãããã¾ãã:
- åç
§ã循ç°ããããã¨ã¯ã§ãã¾ãããJavaScriptã¯ã循ç°ããããã«
__proto__ãå²ãå½ã¦ããã¨ããã¨ã¨ã©ã¼ã«ãªãã¾ãã __proto__ã®å¤ã¯ãªãã¸ã§ã¯ãã¾ãã¯nullã«ãªãã¾ããããªããã£ãã®ãããªããã以å¤ã®ãã¹ã¦ã®å¤ã¯ç¡è¦ããã¾ãã
ã¾ããæç½ããããã¾ãããã1ã¤ã® [[Prototype]] ããåå¨ãã¾ããã ãªãã¸ã§ã¯ãã¯2ã¤ã®ä»ã®ãã®ããç¶æ¿ãããã¨ã¯ã§ãã¾ããã
__proto__ 㯠[[Prototype]] ã®ããã®æ´å²ç㪠getter/setter ã§ãããã®2ã¤ã®éããç¥ããªãã®ã¯ãåå¿è ã®éçºè ã«ãããã¡ãªãã¹ã§ãã
__proto__ ã¯å
é¨ã® [[Prototype]] ããããã£ã¨ã¯ åãã§ã¯ãªã ãã¨ã«æ³¨æãã¦ãã ãããããã¯ã[[Prototype]] ã®getter/setter ã§ããå¾ã§ãããéè¦ãªå ´é¢ãã¿ã¦ããã¾ãããä»ã¯ JavaScript è¨èªãçè§£ããããã«ããã®ããããã£ã«ã¤ãã¦å¿ã«çãã¦ããã¦ãã ããã
__proto__ ããããã£ã¯å°ãæä»£é
ãã§ããããã¯æ´å²çãªçç±ããåå¨ãã¦ãããã¢ãã³ãª JavaScript ã§ã¯ããããã¿ã¤ãã® get/set ã®ä»£ããã«ã Object.getPrototypeOf/Object.setPrototypeOf 颿°ã使ç¨ãããã¨ãæ¨å¥¨ããã¦ãã¾ãããããã®é¢æ°ã«ã¤ãã¦ããå¾ã»ã©èª¬æãã¦ããã¾ãã
ã¹ããã¯ã§ã¯ã__proto__ ã¯ãã©ã¦ã¶ã§ã®ã¿ãµãã¼ããããªããã°ãªãã¾ãããã§ãããå®éã«ã¯ãµã¼ããµã¤ããå«ããã¹ã¦ã®ç°å¢ã§__proto__ ããµãã¼ãããã¦ãã¾ããã®ã§ãå®å
¨ã«ä½¿ç¨ãããã¨ãã§ãã¾ãã
__proto__ è¨æ³ã¯ç´æçã§ããããããã®ã§ãä¾ã§ã¯ãã®è¨æ³ã使ãã¾ãã
æ¸ãè¾¼ã¿ã¯ãããã¿ã¤ãã使ç¨ãã¾ãã
ãããã¿ã¤ãã¯ãããããã£ãèªãããã ãã«ä½¿ããã¾ãã
æ¸ãè¾¼ã¿/å餿ä½ã¯ãªãã¸ã§ã¯ãã§ç´æ¥åä½ãã¾ãã
ä¸ã®ä¾ã§ã¯ãèªèº«ã® walk ã¡ã½ããã rabbit ã«å²ãå½ã¦ã¦ãã¾ãã:
let animal = {
eats: true,
walk() {
/* ãã®ã¡ã½ãã㯠rabbit ã§ã¯ä½¿ããã¾ãã */
}
};
let rabbit = {
__proto__: animal
}
rabbit.walk = function() {
alert("Rabbit! Bounce-bounce!");
};
rabbit.walk(); // Rabbit! Bounce-bounce!
ãã以éãrabbit.walk() å¼ã³åºãã¯ããããã¿ã¤ãã使ããã¨ãªãããªãã¸ã§ã¯ãã®ä¸ã«ããã«ã¡ã½ãããè¦ã¤ãããããå®è¡ãã¾ãã
getter/setter ã®å ´å â ããããããã£ã®èªã¿æ¸ããããã¨ããããã¿ã¤ãã§åç §ããã¦å¼ã³åºããã¾ãã
ä¾ãã°ã以ä¸ã®ã³ã¼ãã§ admin.fullName ããããã£ããã§ãã¯ãã¦ãã ãã:
let user = {
name: "John",
surname: "Smith",
set fullName(value) {
[this.name, this.surname] = value.split(" ");
},
get fullName() {
return `${this.name} ${this.surname}`;
}
};
let admin = {
__proto__: user,
isAdmin: true
};
alert(admin.fullName); // John Smith (*)
// setter ãããªã¬ãã¾ã!
admin.fullName = "Alice Cooper"; // (**)
alert(admin.fullName); // Alice Cooper, admin ã®ç¶æ
ã夿´ããã¾ããã
alert(user.fullName); // John Smith, user ã®ç¶æ
ã¯ãã®ã¾ã¾ã§ãã
ããã§ãè¡ (*) ã§ã¯ããããã㣠admin.fullName ã¯ãããã¿ã¤ãã§ãã user ã getter ãæã£ã¦ããã®ã§ããããå¼ã°ãã¾ããåæ§ã«è¡ (**) ã§ã¯ãããããã£ã¯ãããã¿ã¤ãã«ãã setter ãå¼ã°ãã¾ãã
âthisâ ã®å¤
ä¸ã®ä¾ã§ãè峿·±ã質åãèµ·ããããããã¾ããã: set fullName(value) ã®å
å´ã§ã® this ã®å¤ã¯ãªãã§ããããï¼ãããã㣠this.name 㨠this.surname ãæ¸ããã¦ããã®ã¯ã©ãã§ããããï¼ user ã¾ã㯠admin ?
çãã¯ã·ã³ãã«ã§ã: this ã¯ãããã¿ã¤ãã«ããå½±é¿ãæã£ããåãã¾ããã
ã¡ã½ãããã©ãã«ãããã¯é¢ä¿ããã¾ããï¼ãªãã¸ã§ã¯ãã®ä¸ã§ãããã®ãããã¿ã¤ãå
ã§ããã¡ã½ããå¼ã³åºãã§ã¯ãthis ã¯å¸¸ã«ãããã®åã®ãªãã¸ã§ã¯ãã§ãã
ãããã£ã¦ãsetter ã¯å®éã« this ã¨ã㦠admin ã¨ãªããuser ã§ã¯ããã¾ããã
å¤ãã®ã¡ã½ãããæã¤å¤§ããªãªãã¸ã§ã¯ããæã¡ããããç¶æ¿ããå ´åããããããããã¯å®éã«ã¯é常ã«éè¦ãªãã¨ã§ããç¶æ¿ãããªãã¸ã§ã¯ãã§ç¶æ¿ããã¡ã½ãããå®è¡ããã¨ã大ããªãªãã¸ã§ã¯ãã§ã¯ãªããç¶æ¿ãããªãã¸ã§ã¯ãã®ç¶æ ã夿´ãã¾ãã
ä¾ãã°ãããã§ã¯ animal 㯠âã¡ã½ããæ ¼ç´åâ ã表ç¾ãã¦ãããrabbit ã¯ããã使ãã¾ãã
å¼ã³åºã rabbit.sleep() 㯠rabbit ãªãã¸ã§ã¯ãã« this.isSleeping ãã»ãããã¾ãã:
// animal ãã¡ã½ãããæã£ã¦ãã¾ã
let animal = {
walk() {
if (!this.isSleeping) {
alert(`I walk`);
}
},
sleep() {
this.isSleeping = true;
}
};
let rabbit = {
name: "White Rabbit",
__proto__: animal
};
// rabbit.isSleeping ã夿´ãã
rabbit.sleep();
alert(rabbit.isSleeping); // true
alert(animal.isSleeping); // undefined (prototype ã«ãã®ãããªããããã£ã¯ããã¾ãã)
çµæã®å³ã¯æ¬¡ã®ããã«ãªãã¾ã:
ãã bird, snake ãªã© animal ããç¶æ¿ãããä»ã®ãªãã¸ã§ã¯ããæã£ã¦ããå ´åãããããã¾ã animal ã®ã¡ã½ããã¸ã®ã¢ã¯ã»ã¹ãã§ãã¾ãããããåã¡ã½ããã§ã® this ã¯å¯¾å¿ãããªãã¸ã§ã¯ãã§ãããanimal ã§ã¯ãªããå¼ã³åºãæã«è©ä¾¡ããã¾ãï¼åã®ãããï¼ã ãããã£ã¦ãthis ã«ãã¼ã¿ãæ¸ãè¾¼ãã¨ãããããã®ãªãã¸ã§ã¯ãã«æ ¼ç´ããã¾ãã
çµæã¨ãã¦ãã¡ã½ããã¯å ±æããã¾ããããªãã¸ã§ã¯ãã®ç¶æ ã¯å ±æããã¾ããã
forâ¦in loop
for..in ã«ã¼ãã¯ç¶æ¿ããããããã£ãç¹°ãè¿ãå¦çãã¾ãã
ä¾:
let animal = {
eats: true
};
let rabbit = {
jumps: true,
__proto__: animal
};
// Object.keys ã¯å®è¦ªã®ãã¼ã ããè¿ãã¾ã
alert(Object.keys(rabbit)); // jumps
// for..in ã¯å®è¦ªã¨ç¶æ¿ãããã¼ä¸¡æ¹ãã«ã¼ããã¾ã
for(let prop in rabbit) alert(prop); // jumps, eats
ããã¯æå¾
ãã¦ããåä½ã§ã¯ãªããç¶æ¿ããããããã£ã¯é¤ãããå ´åã¯çµã¿è¾¼ã¿ã®ã¡ã½ãã obj.hasOwnProperty(key)ãå©ç¨ã§ãã¾ãããã㯠obj ã key ã¨ããååã®ããããã£ããã¤å ´åï¼ç¶æ¿ãããã®ã¯å«ã¿ã¾ããï¼ãtrue ãè¿ãã¾ãã
å¾ã£ã¦ãç¶æ¿ããããããã£ããã£ã«ã¿ããï¼ãããã¯ãããã«ã¤ãã¦ä½ããããï¼ãã¨ãå¯è½ã§ãã:
let animal = {
eats: true
};
let rabbit = {
jumps: true,
__proto__: animal
};
for(let prop in rabbit) {
let isOwn = rabbit.hasOwnProperty(prop);
if (isOwn) {
alert(`Our: ${prop}`); // Our: jumps
} else {
alert(`Inherited: ${prop}`); // Inherited: eats
}
}
ããã§ã¯ã次ã®ç¶æ¿ãã§ã¼ã³ãããã¾ã: rabbit 㯠animal ãç¶æ¿ããanimal 㯠Object.prototype ãç¶æ¿ãã¦ãã¾ãï¼animal ã¯ãªãã©ã«ãªãã¸ã§ã¯ã {...} ãªã®ã§ãããã¯ããã©ã«ãã§ãï¼ããã®ä¸ã¯ null ã§ãã:
è峿·±ãç¹ã1ã¤ããã¾ããã¡ã½ãã rabbit.hasOwnProperty ã¯ã©ãããæ¥ãã®ã§ããããï¼æã
ã¯å®ç¾©ãã¦ãã¾ããããã§ã¼ã³ãã¿ããã¨ã§ãã¡ã½ãã㯠Object.prototype.hasOwnProperty ã§æä¾ããã¦ãããã¨ããããã¾ããã¤ã¾ããç¶æ¿ããããã®ã§ãã
â¦ã§ããããªã hasOwnProperty ã¯ç¶æ¿ããããããã£ããªã¹ããã for..in ã«ã¼ãã§ eats ã jumps ã®ããã«ç»å ´ããªãã®ã§ãããã
çãã¯ã·ã³ãã«ã§ããããã¯åæä¸å¯ã ããã§ããObject.prototype ã®ä»ã®ãã¹ã¦ã®ããããã£ã¨åæ§ã«ãenumerable:false ãã©ã°ãæã¡ã¾ããããã¦ãfor..in ã¯åæå¯è½ãªããããã£ã®ã¿ããªã¹ããã¾ãããã®ãããObject.prototype ã®ããããã£ã¯åæããã¾ããã
Object.keys, Object.values ãªã©ã®ã»ã¨ãã©ã®ä»ã®ãã¼/ããªã¥ã¼åå¾ã¡ã½ããã¯ãç¶æ¿ããããããã£ãç¡è¦ãã¾ãã
ãããã¯ãªãã¸ã§ã¯ãèªèº«ã®æä½ã®ã¿è¡ãã¾ãããããã¿ã¤ãããã®ããããã£ã¯èæ ®ãã ã¾ããã
ãµããª
- JavaScriptã§ã¯ããã¹ã¦ã®ãªãã¸ã§ã¯ãã¯é ãã
[[Prototype]]ããããã£ãæã£ã¦ãããããã¯å¥ã®ãªãã¸ã§ã¯ãã¾ãã¯nullã§ãã - ããã«ã¢ã¯ã»ã¹ããããã«
obj.__proto__ã使ããã¨ãã§ãã¾ã(ä»ã®æ¹æ³ãããã¾ãããããã¯å¾ã»ã©å¦ã³ã¾ã)ã [[Prototype]]ã«ãããªãã¸ã§ã¯ãã®åç §ã¯ âãããã¿ã¤ãâ ã¨å¼ã°ãã¾ãã- ããã
objã®ããããã£ãèªã¿ãããã¾ãã¯ã¡ã½ãããå¼ã³åºãããããããã«åå¨ããªãå ´åãJavaScriptã¯ãããã¿ã¤ãã®ä¸ã§è¦ã¤ãããã¨ãã¾ãã - æ¸ãè¾¼ã¿/å餿ä½ã¯ãªãã¸ã§ã¯ãã«å¯¾ãã¦ç´æ¥åä½ãããããã¿ã¤ãã使ãã¾ãã(ããããã£ã setter ã§ãªãéã)ã
obj.method()ãå¼ã³åºããmethodããããã¿ã¤ãããåãããå ´åããthisã¯ä¾ç¶ã¨ãã¦objãåç §ãã¾ãããããã£ã¦ãã¡ã½ããã¯ãã¨ãç¶æ¿ããã¦ããã¨ãã¦ãã常ã«ç¾å¨ã®ãªãã¸ã§ã¯ãã§åä½ãã¾ããfor..inã«ã¼ãã¯èªèº«ã¨ç¶æ¿ããããããã£ä¸¡æ¹ãç¹°ãè¿ãå¦çãã¾ããä»ã®ãã¹ã¦ã®ãã¼/ããªã¥ã¼åå¾ã¡ã½ããã¯ãªãã¸ã§ã¯ãèªèº«ã«å¯¾ãã¦ã®ã¿æä½ãã¾ãã
ã³ã¡ã³ã
<code>ã¿ã°ã使ã£ã¦ãã ãããè¤æ°è¡ã®å ´åã¯<pre>ãã10è¡ãè¶ ããå ´åã«ã¯ãµã³ãããã¯ã¹ã使ã£ã¦ãã ãã(plnkr, JSBin, codepenâ¦)ã