ç¶æ¿ã¨ãããã¿ã¤ããã§ã¼ã³
ããã°ã©ãã³ã°ã«ããã¦ããç¶æ¿ãã¨ã¯è¦ªããåã¸ã¨ç¹æ§ã渡ããã¨ãæããæ°ããã³ã¼ããæ¢åã®ã³ã¼ãã®æ©è½ãåå©ç¨ãããã®ä¸ã«æ§ç¯ã§ããããã«ãã¾ãã JavaScript ã§ã¯ããªãã¸ã§ã¯ããç¨ãã¦ç¶æ¿ãå®è£
ããã¦ãã¾ããããããã®ãªãã¸ã§ã¯ãã¯ããããã¿ã¤ãã¨å¼ã°ããå¥ã®ãªãã¸ã§ã¯ãã¸ã®å
é¨ãªã³ã¯ãä¿æãã¦ãã¾ãããã®ãããã¿ã¤ããªãã¸ã§ã¯ãã¯ãããã«èªèº«ã®ãããã¿ã¤ããæã£ã¦ããã null ããããã¿ã¤ãã¨ãã¦æã¤ãªãã¸ã§ã¯ãã«å°éããã¾ã§ããã®ããã»ã¹ãç¹°ãè¿ããã¾ããå®ç¾©ä¸ã null ã«ã¯ãããã¿ã¤ããåå¨ããããããã¿ã¤ããã§ã¼ã³ã®æçµãªã³ã¯ã¨ãã¦æ©è½ãã¾ãããããã¿ã¤ããã§ã¼ã³ã®ã¡ã³ãã¼ã夿´ããããå®è¡æã«ãããã¿ã¤ããå
¥ãæ¿ããããããã¨ãå¯è½ã§ããããã JavaScript ã§ã¯éçå¼ã³åºãã®ãããªæ¦å¿µã¯åå¨ãã¾ããã
JavaScript ã¯ã¯ã©ã¹ãã¼ã¹ã®è¨èªï¼Java ã C++ ãªã©ï¼ãçµé¨ããéçºè ã«ã¨ã£ã¦ã¯ãåçã§ãããåºå®çãªåããªããã¨ãããå°ãåããã«ãããã®ã§ãããã®æ··ä¹±ã¯ãã°ãã° JavaScript ã®å¼±ç¹ã®ã²ã¨ã¤ã¨ã¿ãªããã¾ããããããã¿ã¤ãç¶æ¿ã¢ãã«ãã®ãã®ã¯ãå®éã«ã¯å¤å ¸çãªã¢ãã«ãããå¼·åãªãã®ã§ããä¾ãã°ããããã¿ã¤ãã¢ãã«ã®ä¸ã«å¤å ¸çãªã¢ãã«ãæ§ç¯ããã®ã¯ããªãæè»½ã§ããã¯ã©ã¹ã¯ãããã£ã¦å®è£ ããã¦ããã®ã§ãã
ã¯ã©ã¹ã¯ç¾å¨åºãæ¡ç¨ããã JavaScript ã®æ°ãããã©ãã¤ã ã¨ãªã£ã¦ãã¾ãããã¯ã©ã¹ãæ°ããç¶æ¿ãã¿ã¼ã³ãããããããã§ã¯ããã¾ãããã¯ã©ã¹ã¯ãããã¿ã¤ãã®ã¡ã«ããºã ã®ã»ã¨ãã©ãæ½è±¡åãã¦ãã¾ãã¾ããããããã¿ã¤ãããã®ä¸ã§ã©ã®ããã«åä½ããããçè§£ãããã¨ã¯ãä»ã§ãæç¨ã ã¨è¨ãã¾ãã
ãããã¿ã¤ããã§ã¼ã³ã¨ç¶æ¿
>ããããã£ã®ç¶æ¿
JavaScript ã®ãªãã¸ã§ã¯ãã¯ããããã£ï¼èªèº«ã®ããããã£ãæãï¼ã®åçãªãè¢ãã§ãã JavaScript ã®ãªãã¸ã§ã¯ãã¯ããããã¿ã¤ããªãã¸ã§ã¯ãã¸ã®ãªã³ã¯ãæã£ã¦ãã¾ãããããªãã¸ã§ã¯ãã®ããããã£ã«ã¢ã¯ã»ã¹ãããã¨ããã¨ããªãã¸ã§ã¯ãã ãã§ãªãããªãã¸ã§ã¯ãã®ãããã¿ã¤ãããããã¿ã¤ãã®ãããã¿ã¤ãã¸ã¨ãä¸è´ããååã®ããããã£ãå¾ããããããããã¿ã¤ããã§ã¼ã³ã®çµç«¯ã«å°éããã¾ã§ãããããã£ã®æ¢ç´¢ãè¡ããã¾ãã
ã¡ã¢:
ECMAScript æ¨æºã«å¾ãã someObject.[[Prototype]] ã¨ãã表è¨ã someObject ã®ãããã¿ã¤ãã示ãã®ã«ä½¿ç¨ãã¦ãã¾ããå
é¨ã¹ããã [[Prototype]] ã«ã¯ Object.getPrototypeOf() 㨠Object.setPrototypeOf() 颿°ã§ã¢ã¯ã»ã¹ãããã¨ãã§ãã¾ããããã¯ãæ¨æºã§ã¯ãªãããå¤ãã®JavaScriptã¨ã³ã¸ã³ã§äºå®ä¸å®è£
ããã¦ãã JavaScript ã®ã¢ã¯ã»ãµã¼ __proto__ ã¨åçã®ãã®ã§ããæ··ä¹±ãé¿ãã¤ã¤ç°¡æ½ã«ããããã«ãããã§ã¯ obj.__proto__ ã®ä½¿ç¨ãé¿ãã代ããã« obj.[[Prototype]] ã使ç¨ãããã¨ã«ãã¾ãããã㯠Object.getPrototypeOf(obj) ã«å¯¾å¿ãããã®ã§ãã
ããã颿°ã® func.prototype ããããã£ã¨æ··åãã¦ã¯ããã¾ããããã®ããããã£ã¯ãæå®ããã颿°ãã³ã³ã¹ãã©ã¯ã¿ã¼ã¨ãã¦ä½¿ç¨ãããã¨ãã«ä½æããããªãã¸ã§ã¯ãã®ãã¹ã¦ã®ãã¤ã³ã¹ã¿ã³ã¹ãã«å²ãå½ã¦ããã [[Prototype]] ãæå®ãã¾ããã³ã³ã¹ãã©ã¯ã¿ã¼é¢æ°ã® prototype ããããã£ã«ã¤ãã¦ã¯ãå¾ã®ç¯ã§èª¬æãã¾ãã
ãªãã¸ã§ã¯ãã® [[Prototype]] ãæå®ããæ¹æ³ã¯ããã¤ãããã¾ããããã㯠å¾ã®ç¯ ã«æ²è¼ããã¦ãã¾ããä»ã®ã¨ããã説æã®ããã« __proto__ æ§æã使ç¨ãã¾ããããã§æ³¨ç®ãã¹ãã¯ã{ __proto__: ... } ã®æ§æã¯ã obj.__proto__ ã¢ã¯ã»ãµã¼ã¨ã¯ç°ãªãã¾ããåè
ã¯æ¨æºçãªãã®ã§ããã鿍奍ã§ã¯ããã¾ããã
{ a: 1, b: 2, __proto__: c } ã®ãããªãªãã¸ã§ã¯ããªãã©ã«ã§ã¯ãå¤ c ï¼ãã㯠null ãä»ã®ãªãã¸ã§ã¯ãã§ãªããã°ãªãã¾ããï¼ãããªãã©ã«ä¸ã§ [[Prototype]] ã¨ãã¦è¡¨ããããªãã¸ã§ã¯ãã«ãªãã®ã«å¯¾ãã a ã b ãªã©ä»ã®ãã¼ã¯ãªãã¸ã§ã¯ãã® èªèº«ã®ãããã㣠ã¨ãªãã¾ãããã®æ§æã§ã¯ã [[Prototype]] ã¯ãªãã¸ã§ã¯ãã®åãªããå
é¨ããããã£ãã«ãªããããã¨ã¦ãèªç¶ã«èªããã¨ãã§ãã¾ãã
ã§ã¯ãããããã£ã«ã¢ã¯ã»ã¹ã試ã¿ãã¨ãã«ãä½ãèµ·ããã®ããè¦ã¦ã¿ã¾ãããã
const o = {
a: 1,
b: 2,
// __proto__ 㯠[[Prototype]] ãè¨å®ãã¾ããããã§ã¯
// ä»ã®ãªãã¸ã§ã¯ããªãã©ã«ã¨ãã¦æå®ãã¾ãã
__proto__: {
b: 3,
c: 4,
},
};
// o.[[Prototype]] 㯠b 㨠c ããããã£ãæã£ã¦ãã¾ãã
// o.[[Prototype]].[[Prototype]] 㯠Object.prototype ã§ãï¼æå³ã¯å¾ã§èª¬æãã¾ãï¼ã
// ããã¦ã o.[[Prototype]].[[Prototype]].[[Prototype]] 㯠null ã§ãã
// null ã¯å®ç¾©ä¸ã [[Prototype]] ãæããªãã®ã§ãããã§ãããã¿ã¤ããã§ã¼ã³ã¯çµäºã§ãã
// ãããã£ã¦ãå®å
¨ãªãããã¿ã¤ããã§ã¼ã³ã¯æ¬¡ã®ããã«ãªãã¾ãã
// { a: 1, b: 2 } ---> { b: 3, c: 4 } ---> Object.prototype ---> null
console.log(o.a); // 1
// 'a' ã¨ããèªèº«ã®ããããã£ã o ã«ããã§ããããï¼ã¯ãããã®å¤ã¯ 1 ã§ãã
console.log(o.b); // 2
// 'b' ã¨ããèªèº«ã®ããããã£ã o ã«ããã§ããããï¼ã¯ãããã®å¤ã¯ 2 ã§ãã
// ãããã¿ã¤ãã«ã 'b' ããããã£ãããã¾ãããã¢ã¯ã»ã¹ããã¾ããã
// ããããããããã£ã®é è½ãã¨å¼ã³ã¾ãã
console.log(o.c); // 4
// 'c' ã¨ããèªèº«ã®ããããã£ã o ã«ããã§ããããï¼ãããããã®ãããã¿ã¤ãã確èªãã¾ãã
// 'c' ã¨ããèªèº«ã®ããããã£ã o.[[Prototype]] ã«ããã§ããããï¼ã¯ãããã®å¤ã¯ 4 ã§ãã
console.log(o.d); // undefined
// 'd' ã¨ããèªèº«ã®ããããã£ã o ã«ããã§ããããï¼ãããããã®ãããã¿ã¤ãã確èªãã¾ãã
// 'd' ã¨ããèªèº«ã®ããããã£ã o.[[Prototype]] ã«ããã§ããããï¼ãããããã®ãããã¿ã¤ãã確èªãã¾ãã
// o.[[Prototype]].[[Prototype]] 㯠Object.prototype ã§ãããæ¢å®ã§ã¯ 'd' ã¨ããããããã£ã¯ããã¾ããããã®ãããã¿ã¤ãã確èªãã¾ãã
// o.[[Prototype]].[[Prototype]].[[Prototype]] 㯠null ã§ããããæ¢ç´¢ã䏿¢ãã
// ããããã£ãè¦ã¤ãããªãã£ããã undefined ãè¿ãã¾ãã
ãããªãã¸ã§ã¯ãã«ããããã£ãè¨å®ããã¨ãèªèº«ã®ããããã£ãä½ããã¾ãããã®åå¾ã¨è¨å®ã®åä½ã®ã«ã¼ã«ã®å¯ä¸ã®ä¾å¤ã¯ãã²ãã¿ã¼ã¾ãã¯ã»ãã¿ã¼ãä»å¨ããã¨ãã§ãã
åæ§ã«ãããé·ããããã¿ã¤ããã§ã¼ã³ã使ãããã¨ãã§ããããããã£ã¯ããããã¹ã¦ã«å¯¾ãã¦æ¢ç´¢ããã¾ãã
const o = {
a: 1,
b: 2,
// __proto__ 㯠[[Prototype]] ãè¨å®ãã¾ããããã§ã¯
// ä»ã®ãªãã¸ã§ã¯ããªãã©ã«ã¨ãã¦æå®ãã¾ãã
__proto__: {
b: 3,
c: 4,
__proto__: {
d: 5,
},
},
};
// { a: 1, b: 2 } ---> { b: 3, c: 4 } ---> { d: 5 } ---> Object.prototype ---> null
console.log(o.d); // 5
ãã¡ã½ãããã®ç¶æ¿
JavaScript ã«ã¯ãã¯ã©ã¹ãã¼ã¹ã®è¨èªãå®ç¾©ãããããªãã¡ã½ãããã¯ããã¾ããã JavaScript ã§ã¯ã©ã®é¢æ°ãããªãã¸ã§ã¯ãã®ããããã£ã¨ããå½¢ã§è¿½å ãããã¨ãã§ãã¾ããç¶æ¿ããã颿°ã¯ãä¸ã§è¦ãããããªããããã£ã®é è½ï¼ãã®å ´åã¯ã¡ã½ããã®ãªã¼ãã¼ã©ã¤ãã®å½¢ï¼ãå«ããä»ã®ã©ã®ããããã£ã¨ãåãããã«åä½ãã¾ãã
ç¶æ¿ããã颿°ãå®è¡ãããã¨ãã® this ã®å¤ã¯ããã®é¢æ°ãèªèº«ã®ããããã£ã¨ãã¦æã¤ãããã¿ã¤ããªãã¸ã§ã¯ãã§ã¯ãªããç¶æ¿ãããªãã¸ã§ã¯ããæãã¾ãã
const parent = {
value: 2,
method() {
return this.value + 1;
},
};
console.log(parent.method()); // 3
// ãã®å ´åã« parent.method ãå¼ã³åºãããã¨ãã 'this' 㯠parent ãæãã¾ãã
// child 㯠parent ãç¶æ¿ãããªãã¸ã§ã¯ã
const child = {
__proto__: parent,
};
console.log(child.method()); // 3
// child.method ãå¼ã³åºãããã¨ã 'this' 㯠child ãåç
§ãã¾ãã
// ã¤ã¾ããparent ã®ã¡ã½ããã child ãç¶æ¿ããã¨ãchild ã«
// ãããã㣠'value' ãæ±ã¾ããã¨ã«ãªãã¾ããããããchild ã¯
// 'value' ã¨ããèªåèªèº«ã§å¼ã³åºãããããããã£ãæã£ã¦ããªãã®ã§ã
// ããããã£ã¯ parent.value ã§ãã [[Prototype]] ã§è¦ã¤ããã¾ãã
child.value = 4; // child ã®ãããã㣠'value' ã«å¤ 4 ã代å
¥ããã
// ãã㯠parent ã® 'value' ããããã£ãé è½ãããã®ã§ãã
// child ãªãã¸ã§ã¯ãã¯æ¬¡ã®ããã«è¦ããããã«ãªãã¾ãã
// { value: 4, __proto__: { value: 2, method: [Function] } }
console.log(child.method()); // 5
// child ã«ã¯ 'value' ããããã£ãããã®ã§ã 'this.value' ã¯
// child.value ã«ãªã
ã³ã³ã¹ãã©ã¯ã¿ã¼
ãããã¿ã¤ãã®å¨åã¯ãç¹ã«ã¡ã½ããã®å ´åããã¹ã¦ã®ã¤ã³ã¹ã¿ã³ã¹ã«åå¨ããå¿
è¦ãããå ´åã«ãããããã£ã®ã»ãããåå©ç¨ã§ãããã¨ã§ããä¾ãã°ãããã¤ãã®ããã¯ã¹ã使ããããããã®ããã¯ã¹ã getValue 颿°ã§ã¢ã¯ã»ã¹å¯è½ãªå¤ãå«ããªãã¸ã§ã¯ãã§ããã¨ãã¾ããç´ æ´ãªå®è£
ã¯æ¬¡ã®ããã«ãªãã¾ãã
const boxes = [
{ value: 1, getValue() { return this.value; } },
{ value: 2, getValue() { return this.value; } },
{ value: 3, getValue() { return this.value; } },
];
ããã¯ãåã¤ã³ã¹ã¿ã³ã¹ãåããã¨ãè¡ãèªåèªèº«ã§é¢æ°ããããã£ãæã¤ãããåé·ã§ä¸è¦ãªãã®ã§ããã壿ªã§ãããã®ä»£ããã«ã getValue ããã¹ã¦ã®ããã¯ã¹ã® [[Prototype]] ã«ç§»åããããã¨ãã§ãã¾ãã
const boxPrototype = {
getValue() {
return this.value;
},
};
const boxes = [
{ value: 1, __proto__: boxPrototype },
{ value: 2, __proto__: boxPrototype },
{ value: 3, __proto__: boxPrototype },
];
ãããããã¨ã§ããã¹ã¦ã®ããã¯ã¹ã® getValue ã¡ã½ãããåã颿°ãåç
§ããããã«ãªããã¡ã¢ãªã¼ä½¿ç¨éãæ¸ãããã¨ãã§ãã¾ãããããããªãã¸ã§ã¯ããçæãããã³ã« __proto__ ãæåã§çµã³ã¤ããã®ã¯ãã¾ã ã¨ã¦ãä¸ä¾¿ã§ããããã§ããªãã¸ã§ã¯ããçæãããã³ã« [[Prototype]] ãèªåçã«è¨å®ãã ã³ã³ã¹ãã©ã¯ã¿ã¼ 颿°ã使ç¨ãããã¨ã«ãªãã¾ããã³ã³ã¹ãã©ã¯ã¿ã¼ã¯ new ã使ã£ã¦å¼ã³åºããã颿°ã§ãã
// ã³ã³ã¹ãã©ã¯ã¿ã¼é¢æ°
function Box(value) {
this.value = value;
}
// Box() ã³ã³ã¹ãã©ã¯ã¿ã¼ã§ä½æããããã¹ã¦ã®ããã¯ã¹ã«ã¯ã
// 以ä¸ã®ããããã£ãããã¾ãã
Box.prototype.getValue = function () {
return this.value;
};
const boxes = [new Box(1), new Box(2), new Box(3)];
new Box(1) 㯠Box ã³ã³ã¹ãã©ã¯ã¿ã¼é¢æ°ããçæããããã¤ã³ã¹ã¿ã³ã¹ãã¨è¨ãã¾ãã Box.prototype ã¯åå使ãã boxPrototype ãªãã¸ã§ã¯ãã¨å¤§ããªéãã¯ãªãããã ã®ãªãã¸ã§ã¯ãã§ããã³ã³ã¹ãã©ã¯ã¿ã¼é¢æ°ãã使ãããã¤ã³ã¹ã¿ã³ã¹ã¯ãèªåçã«ã³ã³ã¹ãã©ã¯ã¿ã¼ã® prototype ããããã£ã [[Prototype]] ã¨ãã¦ä¿æãã¾ããã¤ã¾ãã Object.getPrototypeOf(new Box()) === Box.prototype ã¨ãªãã¾ãã Constructor.prototype ã¯æ¢å®ã§ constructor ã¨ããèªèº«ã®ããããã£ã 1 ã¤æã¡ããããã³ã³ã¹ãã©ã¯ã¿ã¼é¢æ°èªèº«ãåç
§ãã¾ããã¤ã¾ãã Box.prototype.constructor === Box ã«ãªãã¾ããããã«ãããããããã¤ã³ã¹ã¿ã³ã¹ããå
ã®ã³ã³ã¹ãã©ã¯ã¿ã¼ã«ã¢ã¯ã»ã¹ã§ããããã«ãªãã¾ãã
ã¡ã¢:
ã³ã³ã¹ãã©ã¯ã¿ã¼é¢æ°ããããªããã£ãã§ãªãå¤ãè¿ãããå ´åããã®å¤ã new å¼ã®çµæã¨ãªãã¾ãããã®å ´åã[[Prototype]]ã¯æ£ããçµã³ä»ãããã¦ããªãããããã¾ããããå®éã«ã¯ãã¾ãèµ·ãããªãã¯ãã§ãã
ä¸è¨ã®ã³ã³ã¹ãã©ã¯ã¿ã¼é¢æ°ã¯ãã¯ã©ã¹ã§æ¸ãç´ããã¨ãã§ãã¾ãã
class Box {
constructor(value) {
this.value = value;
}
// Box.prototype ã«ä½æãããã¡ã½ãã
getValue() {
return this.value;
}
}
ã¯ã©ã¹ã¯ã³ã³ã¹ãã©ã¯ã¿ã¼é¢æ°ã®ä¸ã®ç³è¡£æ§æã§ããã¤ã¾ãããã¹ã¦ã®ã¤ã³ã¹ã¿ã³ã¹ã®åä½ã夿´ããããã« Box.prototype ãæä½ãããã¨ãã§ãã¾ããããããã¯ã©ã¹ã¯åºæ¬çãªãããã¿ã¤ãæ©æ§ãæ½è±¡åããããã«è¨è¨ããã¦ããã®ã§ããã®ãã¥ã¼ããªã¢ã«ã§ã¯ãã軽éãªã³ã³ã¹ãã©ã¯ã¿ã¼é¢æ°ã®æ§æã使ç¨ãã¦ããããã¿ã¤ããã©ã®ããã«åä½ããããå®å
¨ã«ç¤ºããã¨ã«ãã¾ãã
Box.prototype ã¯ãã¹ã¦ã®ã¤ã³ã¹ã¿ã³ã¹ã® [[Prototype]] ã¨åããªãã¸ã§ã¯ããåç
§ãã¦ããã®ã§ã Box.prototype ã夿´ãããã¨ã§ãã¹ã¦ã®ã¤ã³ã¹ã¿ã³ã¹ã®æ¯ãèãã夿´ãããã¨ãã§ãã¾ãã
function Box(value) {
this.value = value;
}
Box.prototype.getValue = function () {
return this.value;
};
const box = new Box(1);
// ã¤ã³ã¹ã¿ã³ã¹ä½æå¾ã« Box.prototype ã夿´
Box.prototype.getValue = function () {
return this.value + 1;
};
box.getValue(); // 2
è£è¶³ããã¨ã Constructor.prototype ã®åå²ãå½ã¦ (Constructor.prototype = ...) ã¯ã 2 ã¤ã®çç±ããæªãèãã¨è¨ãã¾ãã
- åå²ãå½ã¦åã«ä½æãããã¤ã³ã¹ã¿ã³ã¹ã®
[[Prototype]]ã¯ãåå²ãå½ã¦å¾ã«ä½æãããã¤ã³ã¹ã¿ã³ã¹ã®[[Prototype]]ã¨ã¯å¥ã®ãªãã¸ã§ã¯ããåç §ããããã«ãªãã䏿¹ã®[[Prototype]]ã夿´ãã¦ãããã䏿¹ã¯å¤æ´ããã¾ããã constructorããããã£ãæåã§è¨å®ãç´ããªãéããã³ã³ã¹ãã©ã¯ã¿ã¼é¢æ°ã¯instance.constructorãã辿ããã¨ãã§ããªããªããã¦ã¼ã¶ã¼ã®æå¾ ãè£åãå¯è½æ§ãããã¾ããããã¤ãã®çµã¿è¾¼ã¿æ¼ç®åã¯constructorããããã£ãèªã¿è¾¼ãã®ã§ããããè¨å®ããã¦ããªãå ´åã¯æå¾ éãã«åä½ããªãå¯è½æ§ãããã¾ãã
Constructor.prototype ã¯ã¤ã³ã¹ã¿ã³ã¹ã使ããã¨ãã«ã®ã¿æç¨ã§ãã Constructor.[[Prototype]] ã¨ã¯é¢ä¿ããã¾ãããã³ã³ã¹ãã©ã¯ã¿ã¼é¢æ°ã®èªèº«ã®ãããã¿ã¤ãã§ãã Function.prototypeãã¤ã¾ãã Object.getPrototypeOf(Constructor) === Function.prototype ã¨ã¯é¢ä¿ãããã¾ããã
ãªãã©ã«ã®æé»çãªã³ã³ã¹ãã©ã¯ã¿ã¼
JavaScript ã®ããã¤ãã®ãªãã©ã«æ§æã¯ãæé»ã®ãã¡ã« [[Prototype]] ãè¨å®ããã¤ã³ã¹ã¿ã³ã¹ã使ãã¾ããä¾ãã°æ¬¡ã®ããã«ãªãã¾ãã
// ãªãã¸ã§ã¯ãã®ãªãã©ã«ï¼`__proto__` ãã¼ãæããªãï¼ã«ã¯ã
// èªåçã« `Object.prototype` ã `[[Prototype]]` ã¨ãã¦è¨å®ããã¾ã
const object = { a: 1 };
Object.getPrototypeOf(object) === Object.prototype; // true
// é
åãªãã©ã«ã§ã¯ãèªåçã« `Array.prototype` ã `[[Prototype]]` ã¨ãªãã¾ã
const array = [1, 2, 3];
Object.getPrototypeOf(array) === Array.prototype; // true
// RegExp ãªãã©ã«ã§ã¯ãèªåçã« `RegExp.prototype` as their `[[Prototype]]`
const regexp = /abc/;
Object.getPrototypeOf(regexp) === RegExp.prototype; // true
ãè±ç³ããã¦ã³ã³ã¹ãã©ã¯ã¿ã¼ã®å½¢ã«ãããã¨ãã§ãã¾ãã
const array = new Array(1, 2, 3);
const regexp = new RegExp("abc");
ä¾ãã°ã map() ã®ãããªãé
åã®ã¡ã½ãããã¯ãåã« Array.prototype ã§å®ç¾©ãããã¡ã½ããã§ããããã®ããããã¹ã¦ã®é
åã®ã¤ã³ã¹ã¿ã³ã¹ã§èªåçã«å©ç¨ãããã¨ãã§ãã¾ãã
è¦å:
ãã¤ã¦ä½¿ç¨ããã¦ãã誤ã£ãä½¿ãæ¹ã 1 ã¤ããã¾ãã Object.prototype ã¾ãã¯ä»ã®çµã¿è¾¼ã¿ãããã¿ã¤ãã®ãããããæ¡å¼µãããã¨ã§ãããã®èª¤ã£ãä½¿ãæ¹ã®ä¾ã¨ãã¦ãArray.prototype.myMethod = function () {...} ãå®ç¾©ãã¦ããã¹ã¦ã®é
åã¤ã³ã¹ã¿ã³ã¹ã§ myMethod ã§ããããã«ããã¨ãããã®ãããã¾ãã
ãã®èª¤ã£ãä½¿ãæ¹ã¯ããã¢ã³ãã¼ããããã¨å¼ã°ãã¦ãã¾ããã¢ã³ãã¼ãããã¯åæ¹äºææ§ãæãªãå±éºæ§ããããå°æ¥ãè¨èªããã®ã¡ã½ãããå¥ã®ã·ã°ããã£ã§è¿½å ããå ´åãã³ã¼ããå£ãã¦ãã¾ãããã§ãã SmooshGate ã®ãããªäºä»¶ãå¼ãèµ·ããã JavaScript ããã¦ã§ããå£ããªããããã«ãããã¨ãããããè¨èªã®é²æ©ã«ã¨ã£ã¦é常ã«åä»ãªåå¨ã¨ãªããã¾ãã
çµã¿è¾¼ã¿ã®ãããã¿ã¤ããæ¡å¼µããçç±ã¨ãã¦å¯ä¸ã®è¯ããã®ã¯ãæ°ãã JavaScript ã¨ã³ã¸ã³ã®æ©è½ããã¨ãã° Array.prototype.forEach ãªã©ãããã¯ãã¼ããããã¨ã§ãã
æ´å²çãªçç±ã«ãããããã¤ãã®çµã¿è¾¼ã¿ã³ã³ã¹ãã©ã¯ã¿ã¼ã® prototype ããããã£ã¯ã¤ã³ã¹ã¿ã³ã¹ãã®ãã®ã§ãããã¨ã«æ³¨ç®ããã¨è峿·±ãããããã¾ãããä¾ãã°ã Number.prototype ã¯æ°åã® 0ã Array.prototype ã¯ç©ºã®é
åã RegExp.prototype 㯠/(?:)/ ã¨ãªãã¾ãã
Number.prototype + 1; // 1
Array.prototype.map((x) => x + 1); // []
String.prototype + "a"; // "a"
RegExp.prototype.source; // "(?:)"
Function.prototype(); // Function.prototype ã¯ããèªèº«ã§ã¯ä½ãããªã颿°
ããããã¦ã¼ã¶ã¼å®ç¾©ãããã³ã³ã¹ãã©ã¯ã¿ã¼ãã Map ã®ãããªç¾ä»£ã®ã³ã³ã¹ãã©ã¯ã¿ã¼ã§ã¯ããã®ãããªãã¨ã¯èµ·ããã¾ããã
Map.prototype.get(1);
// Uncaught TypeError: get method called on incompatible Map.prototype
ããé·ãç¶æ¿ã®ãã§ã¼ã³ã®æ§ç¯
Constructor.prototype ããããã£ã¯ãã³ã³ã¹ãã©ã¯ã¿ã¼ã®ã¤ã³ã¹ã¿ã³ã¹ã® [[Prototype]] ã¨ãªãã Constructor.prototype èªèº«ã® [[Prototype]] ãå«ãã¦ãã®ã¾ã¾ã®å½¢ã§è¡¨ç¤ºããã¾ããæ¢å®ã§ã Constructor.prototype 㯠ãã¬ã¼ã³ãªãã¸ã§ã¯ã ã§ããã¤ã¾ãã Object.getPrototypeOf(Constructor.prototype) === Object.prototype ã«ãªãã¾ããå¯ä¸ã®ä¾å¤ã¯ Object.prototype èªèº«ã§ããã® [[Prototype]] 㯠null ã§ã - ã¤ã¾ãã Object.getPrototypeOf(Object.prototype) === null ã¨ãããã¨ã§ãããããã£ã¦ãå
¸åçãªã³ã³ã¹ãã©ã¯ã¿ã¼ã¯ä»¥ä¸ã®ãããªãããã¿ã¤ããã§ã¼ã³ãæ§ç¯ãã¾ãã
function Constructor() {}
const obj = new Constructor();
// obj ---> Constructor.prototype ---> Object.prototype ---> null
ãã£ã¨é·ããããã¿ã¤ããã§ã¼ã³ãæ§ç¯ããå ´åã¯ã Constructor.prototype ã® [[Prototype]] ã Object.setPrototypeOf() 颿°ã§è¨å®ãããã¨ãã§ãã¾ãã
function Base() {}
function Derived() {}
// `Derived.prototype` ã® `[[Prototype]]` ã
// `Base.prototype` ã«è¨å®
Object.setPrototypeOf(Derived.prototype, Base.prototype);
const obj = new Derived();
// obj ---> Derived.prototype ---> Base.prototype ---> Object.prototype ---> null
ã¯ã©ã¹ã®ç¨èªã§ã¯ããã㯠extends æ§æã使ç¨ããã®ã¨åãã§ãã
class Base {}
class Derived extends Base {}
const obj = new Derived();
// obj ---> Derived.prototype ---> Base.prototype ---> Object.prototype ---> null
ã¾ããç¶æ¿ãã§ã¼ã³ãæ§ç¯ããããã«ã Object.create() ã使ç¨ããå¤ãã³ã¼ããè¦ãããããããã¾ããããããããã㯠prototype ããããã£ãå代å
¥ãã constructor ããããã£ãåé¤ãããããã¨ã©ã¼ã®å¯è½æ§ãé«ããªãã¾ãã䏿¹ãã³ã³ã¹ãã©ã¯ã¿ã¼ãã¾ã ã¤ã³ã¹ã¿ã³ã¹ã使ãã¦ããªãå ´åãããã©ã¼ãã³ã¹ã®åä¸ã¯æããã§ã¯ãªãããããã¾ããã
function Base() {}
function Derived() {}
// `Derived.prototype` ã«æ°ãããªãã¸ã§ã¯ãã®å代å
¥ãã
// `Base.prototype` ã `[[Prototype]]` ã¨ããã
// ããã¯ä½¿ããªãã§ãã ããã â 代ããã« Object.setPrototypeOf ã§å¤æ´ãã¦ãã ããã
Derived.prototype = Object.create(Base.prototype);
ãããã¿ã¤ãã®èª¿æ»ï¼ããæ·±ãæãä¸ãã¦ã¿ã
ãã®è£å´ã§ä½ãèµ·ãã£ã¦ããã®ããããå°ã詳ããè¦ã¦ã¿ã¾ãããã
JavaScript ã§ã¯ãåè¿°ããããã«ã颿°ã¯ããããã£ãæã¤ãã¨ãã§ãã¾ãããã¹ã¦ã®é¢æ°ã¯ prototype ã¨ããååã®ç¹å¥ãªããããã£ãããã¾ãã以ä¸ã®ã³ã¼ãã¯ç¬ç«ãããã®ã§ãããã¨ã«æ³¨æãã¦ãã ããï¼ãã®ã¦ã§ããã¼ã¸ã«ã¯ã以ä¸ã®ã³ã¼ã以å¤ã«ä»ã® JavaScript ã¯åå¨ããªãã¨èãã¦ããã§ãããï¼ãæé«ã®å¦ç¿ä½é¨ãããããã«ã¯ãã³ã³ã½ã¼ã«ãéãããã³ã³ã½ã¼ã«ãã¿ãã«ç§»åãã¦ã以ä¸ã® JavaScript ã³ã¼ããã³ãã¼ï¼ãã¼ã¹ããã Enter/Return ãã¼ãæ¼ãã¦å®è¡ãããã¨ãå¼·ããå§ããã¾ããï¼ã³ã³ã½ã¼ã«ã¯ãã»ã¨ãã©ã®ã¦ã§ããã©ã¦ã¶ã¼ã®éçºè
ãã¼ã«ã«è¨è¼ããã¦ãã¾ãã詳ããæ
å ±ã¯ Firefox éçºè
ãã¼ã«ãChrome éçºè
ãã¼ã«ãEdge éçºè
ãã¼ã«ãåç
§ãã¦ãã ããã
function doSomething() {}
console.log(doSomething.prototype);
// 颿°ãã©ã®ããã«å®£è¨ãããã¯åé¡ã§ã¯ããã¾ããã
// JavaScript ã®é¢æ°ã¯å¸¸ã«æ¢å®ã®ãããã¿ã¤ãããããã£ã
// ä¿æãã¾ãããã ããä¾å¤ã 1 ã¤ããã¾ããã¢ãã¼é¢æ°ã¯
// æ¢å®ã®ãããã¿ã¤ãããããã£ãæã¡ã¾ããã
const doSomethingFromArrowFunction = () => {};
console.log(doSomethingFromArrowFunction.prototype);
ä¸ã§è¦ãããã«ãdoSomething() ã¯æ¢å®ã§ prototype ããããã£ãææãã¦ãããã³ã³ã½ã¼ã«ã«è¡¨ç¤ºããã¦ããããã«ãªãã¾ãããã®ã³ã¼ãã®å®è¡å¾ãã³ã³ã½ã¼ã«ã«ã¯ãã®ãããªãªãã¸ã§ã¯ãã表示ããã¦ããã¯ãã§ãã
{
constructor: Æ doSomething(),
[[Prototype]]: {
constructor: Æ Object(),
hasOwnProperty: Æ hasOwnProperty(),
isPrototypeOf: Æ isPrototypeOf(),
propertyIsEnumerable: Æ propertyIsEnumerable(),
toLocaleString: Æ toLocaleString(),
toString: Æ toString(),
valueOf: Æ valueOf()
}
}
ã¡ã¢:
Chrome ã®ã³ã³ã½ã¼ã«ã§ã¯ã [[Prototype]] ã使ç¨ãã¦ãªãã¸ã§ã¯ãã®ãããã¿ã¤ãã示ãã¦ããã仿§ã®ç¨èªã«å¾ã£ã¦ãã¾ãã Firefoxã§ã¯ <prototype> ã使ç¨ãã¦ãã¾ããä¸è²«æ§ãä¿ã¤ããã«ãããã§ã¯ [[Prototype]] ã使ç¨ãã¾ãã
以ä¸ã®ããã«ã doSomething() ã®ãããã¿ã¤ãã«ããããã£ã追å ãããã¨ãã§ãã¾ãã
function doSomething() {}
doSomething.prototype.foo = "bar";
console.log(doSomething.prototype);
çµæã¯æ¬¡ã®éãã§ãã
{
foo: "bar",
constructor: Æ doSomething(),
[[Prototype]]: {
constructor: Æ Object(),
hasOwnProperty: Æ hasOwnProperty(),
isPrototypeOf: Æ isPrototypeOf(),
propertyIsEnumerable: Æ propertyIsEnumerable(),
toLocaleString: Æ toLocaleString(),
toString: Æ toString(),
valueOf: Æ valueOf()
}
}
ããã§ã new æ¼ç®åã使ç¨ãã¦ããã®ãããã¿ã¤ããå
ã« doSomething() ã®ã¤ã³ã¹ã¿ã³ã¹ã使ãããã¨ãã§ãã¾ãã new æ¼ç®åã使ç¨ããã«ã¯ã颿°ãå¼ã³åºãéã« new ã¨ããæ¥é è¾ãä»ãã以å¤ã¯é常éãè¡ãã¾ãã new æ¼ç®åãç¨ãã¦é¢æ°ãå¼ã³åºãã¨ããã®é¢æ°ã®ã¤ã³ã¹ã¿ã³ã¹ã§ãããªãã¸ã§ã¯ããè¿ãã¾ããããã¦ããã®ãªãã¸ã§ã¯ãã«ããããã£ã追å ãããã¨ãã§ãã¾ãã
以ä¸ã®ã³ã¼ãã試ãã¦ã¿ã¦ãã ããã
function doSomething() {}
doSomething.prototype.foo = "bar"; // ãããã¿ã¤ãã«ããããã£ã追å
const doSomeInstancing = new doSomething();
doSomeInstancing.prop = "some value"; // ãªãã¸ã§ã¯ãã«ããããã£ã追å
console.log(doSomeInstancing);
ãã®çµæã以ä¸ã®ãããªåºåãå¾ããã¾ãã
{
prop: "some value",
[[Prototype]]: {
foo: "bar",
constructor: Æ doSomething(),
[[Prototype]]: {
constructor: Æ Object(),
hasOwnProperty: Æ hasOwnProperty(),
isPrototypeOf: Æ isPrototypeOf(),
propertyIsEnumerable: Æ propertyIsEnumerable(),
toLocaleString: Æ toLocaleString(),
toString: Æ toString(),
valueOf: Æ valueOf()
}
}
}
ä¸ã§è¦ãããã«ãdoSomeInstancingã® [[Prototype]] 㯠doSomething.prototype ã§ããããããããã¯ä½ããããã®ãªã®ã§ããããï¼ doSomeInstancing ã®ããããã£ã«ã¢ã¯ã»ã¹ããã¨ããã©ã³ã¿ã¤ã ã¯ã¾ã doSomeInstancing ããã®ããããã£ãæã£ã¦ãããã©ããã調ã¹ã¾ãã
ãã doSomeInstancing ããã®ããããã£ãæã£ã¦ããªãå ´åãã©ã³ã¿ã¤ã 㯠doSomeInstancing.[[Prototype]] ï¼å¥å doSomething.prototypeï¼ã§ãã®ããããã£ãæ¢ãã¾ããããã doSomeInstancing.[[Prototype]] ãæ¢ãã¦ããããããã£ãä¿æãã¦ããå ´åã doSomeInstancing.[[Prototype]] ä¸ã®ãã®ããããã£ã使ç¨ããã¾ãã
ããã§ãªããã°ã doSomeInstancing.[[Prototype]] ããã®ããããã£ãæã£ã¦ããªãã£ãå ´åã doSomeInstancing.[[Prototype]].[[Prototype]] ããã®ããããã£ã調ã¹ããã¨ã«ãªãã¾ããæ¢å®ã§ãä»»æã®é¢æ°ã® prototype ããããã£ã® [[Prototype]] 㯠Object.prototype ã§ããããã§ãdoSomeInstancing.[[Prototype]].[[Prototype]] ï¼å¥å doSomething.prototype.[[Prototype]] ï¼å¥å Object.prototypeï¼ï¼ã¯ãæ¤ç´¢å¯¾è±¡ã®ããããã£ã調ã¹ããã¨ã«ãªãã¾ãã
ãããã®ããããã£ã doSomeInstancing.[[Prototype]].[[Prototype]] ã®ä¸ã«è¦ã¤ãããªããã°ã doSomeInstancing.[[Prototype]].[[Prototype]].[[Prototype]] ãæ¢ãã¾ãããããã doSomeInstancing.[[Prototype]].[[Prototype]].[[Prototype]] ã¯åå¨ãã¾ããããªããªãã Object.prototype.[[Prototype]] 㯠null ã§ããããã§ããããã¦ã [[Prototype]] ã®ãããã¿ã¤ããã§ã¼ã³å
¨ä½ã調ã¹ãããå¾ãã©ã³ã¿ã¤ã ã¯ããããã£ãåå¨ããªããã¨ã主張ããããããã£ã®å¤ã¯ undefined ã§ããã¨çµè«ä»ãã¾ãã
ã³ã³ã½ã¼ã«ã«ããå°ãã³ã¼ããå ¥åãã¦ã¿ã¾ãããã
function doSomething() {}
doSomething.prototype.foo = "bar";
const doSomeInstancing = new doSomething();
doSomeInstancing.prop = "some value";
console.log("doSomeInstancing.prop: ", doSomeInstancing.prop);
console.log("doSomeInstancing.foo: ", doSomeInstancing.foo);
console.log("doSomething.prop: ", doSomething.prop);
console.log("doSomething.foo: ", doSomething.foo);
console.log("doSomething.prototype.prop:", doSomething.prototype.prop);
console.log("doSomething.prototype.foo: ", doSomething.prototype.foo);
ãã®çµæã¯ä»¥ä¸ã®ããã«ãªãã¾ãã
doSomeInstancing.prop: some value doSomeInstancing.foo: bar doSomething.prop: undefined doSomething.foo: undefined doSomething.prototype.prop: undefined doSomething.prototype.foo: bar
ãããã¿ã¤ããã§ã¼ã³ã使ã»å¤æ´ããæ§ã ãªæ¹æ³
ããã¾ã§ããªãã¸ã§ã¯ãã使ãããã®ãããã¿ã¤ããã§ã¼ã³ã夿´ããå¤ãã®æ¹æ³ã«è§¦ãã¦ãã¾ãããããããã®ææ³ã®é·æã¨çæãæ¯è¼ããªããããã¾ãã¾ãªæ¹æ³ãä½ç³»çã«ã¾ã¨ãã¦ããã¾ãã
æ§æã§ä½æããããªãã¸ã§ã¯ã
const o = { a: 1 };
// ãªãã¸ã§ã¯ã o ãæ°ãã使ããã¨ã Object.prototype ã [[Prototype]] ã«ãªãã¾ãã
// Object.prototype ã¯ãããã¿ã¤ãã null ã§ãã
// o ---> Object.prototype ---> null
const b = ["yo", "whadup", "?"];
// é
å㯠Array.prototype ãç¶æ¿ãã¾ãã
// ï¼indexOf, forEach, ãªã©ã®ã¡ã½ãããããã¾ããï¼
// ãããã¿ã¤ããã§ã¼ã³ã¯æ¬¡ã®ããã«ãªãã¾ãã
// b ---> Array.prototype ---> Object.prototype ---> null
function f() {
return 2;
}
// 颿°ã¯ Function.prototype ãç¶æ¿ãã¾ãã
// ï¼call, bind, ãªã©ã®ã¡ã½ãããããã¾ããï¼
// f ---> Function.prototype ---> Object.prototype ---> null
const p = { b: 2, __proto__: o };
// æ°ãã使ãããªãã¸ã§ã¯ãã® [[Prototype]] ã¯ã __proto__ ãªãã©ã«
// ããããã£ãä»ãã¦æã示ããã¨ãã§ãã¾ãã
// ï¼Object.prototype.__proto__ ã¢ã¯ã»ãµã¼ã¨æ··åããªãã§ãã ãããï¼
// p ---> o ---> Object.prototype ---> null
__proto__ ãã¼ããªãã¸ã§ã¯ãåæååã§ä½¿ç¨ããå ´åã __proto__ ãã¼ããªãã¸ã§ã¯ãã§ã¯ãªããã®ã«è¨å®ããã¨ãä¾å¤ã¯çºçãããã¨ã©ã¼ã表示ããã¾ããã Object.prototype.__proto__ ã®ã»ãã¿ã¼ã¨ã¯ç°ãªãããªãã¸ã§ã¯ããªãã©ã«åæååã§ã® __proto__ ã¯æ¨æºåããã³æé©åããã¦ããã Object.create ãããããã©ã¼ãã³ã¹ãåä¸ãããã¨ãããã¾ãããªãã¸ã§ã¯ãã®ä½ææã«ç¬èªã®ããããã£ã追å ã§å®£è¨ããæ¹ãã Object.create ããã人éå·¥å¦çã«åªãã¦ãã¾ãã
ã³ã³ã¹ãã©ã¯ã¿ã¼é¢æ°ã§
function Graph() {
this.vertices = [];
this.edges = [];
}
Graph.prototype.addVertex = function (v) {
this.vertices.push(v);
};
const g = new Graph();
// g ã¯èªèº«ã®ãããã㣠'vertices' 㨠'edges' ãæã¤ãªãã¸ã§ã¯ãã§ãã
// g.[[Prototype]] 㯠Graph.prototype ã® new Graph() ãå®è¡ãããã¨ãã®å¤ã§ãã
ã³ã³ã¹ãã©ã¯ã¿ã¼é¢æ°ã¯ãåæã® JavaScript ããå©ç¨ã§ããæ©è½ã§ããããã®ãããã¨ã¦ãé«éã§ãæ¨æºçã§ãJIT ã³ã³ãã¤ã©ã«ããæé©åãå¯è½ã§ãããããããã®æ¹æ³ã§è¿½å ãããã¡ã½ããã¯æ¢å®ã§ã¯åæå¯è½ã§ããããããé©åã«ãè¡ãã®ã¯é£ããã§ããããã¯ãã¯ã©ã¹æ§æãçµã¿è¾¼ã¿ã¡ã½ããã®åä½ã¨ä¸è´ãã¾ãããã¾ããåè¿°ã®ã¨ãããé·ãç¶æ¿ãã§ã¼ã³ã¯ã¨ã©ã¼ã®å¯è½æ§ãé«ããªãã¾ãã
Object.create() ã§
Object.create() ãå¼ã³åºãã¨ãæ°ãããªãã¸ã§ã¯ãã使ããã¾ãããã®ãªãã¸ã§ã¯ãã® [[Prototype]] ããã®é¢æ°ã®æåã®å¼æ°ã«ãªãã¾ãã
const a = { a: 1 };
// a ---> Object.prototype ---> null
const b = Object.create(a);
// b ---> a ---> Object.prototype ---> null
console.log(b.a); // 1 ï¼ç¶æ¿ï¼
const c = Object.create(b);
// c ---> b ---> a ---> Object.prototype ---> null
const d = Object.create(null);
// d ---> null ï¼d ã¯ãããã¿ã¤ãã¨ãã¦ç´æ¥ null ãæã¤ãªãã¸ã§ã¯ãï¼
console.log(d.hasOwnProperty);
// undefinedã Object.prototype ãç¶æ¿ãã¦ããªããã
ãªãã¸ã§ã¯ãåæååã«ããã __proto__ ãã¼ã¨åæ§ã«ãObject.create() ã使ç¨ããã¨ããªãã¸ã§ã¯ãã®ä½ææã«ãããã¿ã¤ããç´æ¥è¨å®ãããã¨ãã§ããå®è¡æã«ãªãã¸ã§ã¯ãããããªãæé©åãããã¨ãå¯è½ã«ãªãã¾ããã¾ãããããã¿ã¤ãã null ã¨ãã Object.create(null) ã使ç¨ãã¦ããªãã¸ã§ã¯ãã使ãããã¨ãã§ãã¾ãã Object.create() ã® 2 çªç®ã®å¼æ°ã使ç¨ããã¨ãæ°ãããªãã¸ã§ã¯ãã®åããããã£ã®å±æ§ãæ£ç¢ºã«æå®ãããã¨ãã§ãã¾ãããããã¯è«¸åã®å£ã¨ãªãã¾ãã
- ãªãã¸ã§ã¯ã使æã«ããªãã¸ã§ã¯ããªãã©ã«ã§ã¯å®ç¾ä¸å¯è½ãªãåæä¸å¯è½ãªããããã£ãªã©ã使ãããã¨ãã§ãã¾ãã
- ãªãã¸ã§ã¯ããªãã©ã«ãããã¯ããã«åé·çã§ãã¨ã©ã¼ã®å¯è½æ§ãé«ããªãã¾ãã
- ç¹ã«å¤ãã®ããããã£ã使ããå ´åã«ã¯ããªãã¸ã§ã¯ããªãã©ã«ãããæéããããå ´åãããã¾ãã
ã¯ã©ã¹ã§
class Rectangle {
constructor(height, width) {
this.name = "Rectangle";
this.height = height;
this.width = width;
}
}
class FilledRectangle extends Rectangle {
constructor(height, width, color) {
super(height, width);
this.name = "Filled rectangle";
this.color = color;
}
}
const filledRectangle = new FilledRectangle(5, 10, "blue");
// filledRectangle ---> FilledRectangle.prototype ---> Rectangle.prototype ---> Object.prototype ---> null
ã¯ã©ã¹ã¯ãè¤éãªç¶æ¿æ§é ãå®ç¾©ããéã«ãæé«ã®èªã¿ãããã¨ä¿å®æ§ãå®ç¾ãã¾ãããã©ã¤ãã¼ãè¦ç´ ã¯ããããã¿ã¤ãç¶æ¿ã§ã¯ç°¡åã«ç½®ãæãããã¨ãã§ããªãæ©è½ã§ããããããã¯ã©ã¹ã¯å¾æ¥ã®ã³ã³ã¹ãã©ã¯ã¿ã¼é¢æ°ãããæé©åããã¦ããããå¤ãç°å¢ã§ã¯å¯¾å¿ãã¦ãã¾ããã
Object.setPrototypeOf() ã§
ä¸è¨ã®ãã¹ã¦ã®ã¡ã½ããã¯ãªãã¸ã§ã¯ãçææã«ãããã¿ã¤ããã§ã¼ã³ãè¨å®ããã®ã«å¯¾ãã Object.setPrototypeOf() ã¯æ¢åã®ãªãã¸ã§ã¯ãã® [[Prototype]] å
é¨ããããã£ã夿´ãããã¨ãã§ãã¾ããããã«ã Object.create(null) ã§ä½æãããããã¿ã¤ãã®ãªããªãã¸ã§ã¯ãã«ãããã¿ã¤ããå¼·å¶çã«è¨å®ãããããªãã¸ã§ã¯ãã®ãããã¿ã¤ãã null ã«è¨å®ãããã¨ã§é¤å»ãããã¨ãã§ãã¾ãã
const obj = { a: 1 };
const anotherObj = { b: 2 };
Object.setPrototypeOf(obj, anotherObj);
// obj ---> anotherObj ---> Object.prototype ---> null
ãããããããã¿ã¤ããåçã«è¨å®ããã¨ããããã¿ã¤ããã§ã¼ã³ã«å¯¾ãã¦ã¨ã³ã¸ã³ãè¡ã£ãæé©åããã¹ã¦ç¡å¹ã«ãã¦ãã¾ããããå¯è½ã§ããã°ä½æä¸ã«ãããã¿ã¤ããè¨å®ãã¹ãã§ããããã«ãããã¨ã³ã¸ã³ã«ãã£ã¦ã¯ãæé©åãè§£é¤ãã¦ã³ã¼ããåã³ã³ãã¤ã«ãã仿§éãã«åä½ãããå¿ è¦ãçããå¯è½æ§ãããã¾ãã
__proto__ ã¢ã¯ã»ãµã¼ã§
ãã¹ã¦ã®ãªãã¸ã§ã¯ã㯠Object.prototype.__proto__ ã»ãã¿ã¼ãç¶æ¿ãã¦ãããããã使ç¨ãã¦æ¢åã®ãªãã¸ã§ã¯ãã® [[Prototype]] ãè¨å®ãããã¨ãã§ãã¾ãï¼__proto__ ãã¼ããªãã¸ã§ã¯ãã§ãªã¼ãã¼ã©ã¤ãããã¦ããªãå ´åï¼ã
è¦å:
Object.prototype.__proto__ ã¢ã¯ã»ãµã¼ã¯æ¨æºå¤ã§éæ¨å¥¨ã§ãã 代ããã«ã常㫠Object.setPrototypeOf ã使ç¨ããå¿
è¦ãããã¾ãã
const obj = {};
// 使ç¨ããªãã§ãã ãããä¾ç¤ºã®ããã®ãã®ã§ãã
obj.__proto__ = { barProp: "bar val" };
obj.__proto__.__proto__ = { fooProp: "foo val" };
console.log(obj.fooProp);
console.log(obj.barProp);
Object.setPrototypeOf ã¨æ¯è¼ããã¨ããªãã¸ã§ã¯ãã§ã¯ãªããã®ã« __proto__ ãè¨å®ããã¨ãä¾å¤ãçºãããããã¨ãªããéãã«å¤±æãã¾ãã ã¾ããè¥å¹²ã§ããããã©ã¦ã¶ã¼ã®å¯¾å¿ãåªãã¦ãã¾ãã ããããããã¯éæ¨æºã§ããã鿍奍ã®ãã®ã§ãã ã»ã¨ãã©ã®å ´åã代ããã« Object.setPrototypeOf ã使ç¨ãã¾ãããã
ããã©ã¼ãã³ã¹
ãããã¿ã¤ããã§ã¼ã³ã®ä¸ä½ã«ããããããã£ãåç §ããæéã¯ãããã©ã¼ãã³ã¹ã«ãã¤ãã¹ã®å½±é¿ãä¸ããå¯è½æ§ããããããã©ã¼ãã³ã¹ãéè¦è¦ãããã³ã¼ãã§ã¯ããã®å½±é¿ã¯å¤§ããããããã¾ãããããã«ãåå¨ããªãããããã£ã«ã¢ã¯ã»ã¹ãããã¨ããã¨ã常ã«ãããã¿ã¤ããã§ã¼ã³ãå®å ¨ã«ç¸¦æãããã¨ã«ãªãã¾ãã
ã¾ãããªãã¸ã§ã¯ãã®ããããã£ãå復å¦çããã¨ãã«ããããã¿ã¤ããã§ã¼ã³ä¸ã«ãããã¹ã¦ã® åæå¯è½ãªããããã£ãåæããããã¨ã«ãªãã¾ãããªãã¸ã§ã¯ãããããã¿ã¤ããã§ã¼ã³ã®ã©ããã§ã¯ãªãã_èªåèªèº«ã«å®ç¾©ãããããããã£ãæã£ã¦ãããã©ããã調ã¹ãã«ã¯ã hasOwnProperty ã¾ã㯠Object.hasOwn ã¡ã½ããã使ç¨ããªããã°ããã¾ããã [[Prototype]] ã¨ã㦠null ãæã¤ãªãã¸ã§ã¯ããé¤ããã¹ã¦ã®ãªãã¸ã§ã¯ãã¯ã hasOwnProperty ã Object.prototype ããç¶æ¿ããã¦ãã¾ãããã ãããããã¿ã¤ããã§ã¼ã³ã®ããã«ä¸ã§ãªã¼ãã¼ã©ã¤ãããã¦ããå ´åãé¤ãã¾ããå
·ä½çãªä¾ãæããããã«ãä¸è¨ã®ã°ã©ãã®ä¾ã®ãããªã³ã¼ãã使ã£ã¦èª¬æãã¾ãããã
function Graph() {
this.vertices = [];
this.edges = [];
}
Graph.prototype.addVertex = function (v) {
this.vertices.push(v);
};
const g = new Graph();
// g ---> Graph.prototype ---> Object.prototype ---> null
g.hasOwnProperty("vertices"); // true
Object.hasOwn(g, "vertices"); // true
g.hasOwnProperty("nope"); // false
Object.hasOwn(g, "nope"); // false
g.hasOwnProperty("addVertex"); // false
Object.hasOwn(g, "addVertex"); // false
Object.getPrototypeOf(g).hasOwnProperty("addVertex"); // true
ã¡ã¢: ããããããã£ã undefined ã§ãããã©ããã調ã¹ãã ãã§ã¯ååã§ã¯ããã¾ãããããããã£ããã£ããåå¨ãã¦ãã¦ããã¾ãã¾ undefined ã«è¨å®ããã¦ããã ããããããªãããã§ãã
ã¾ã¨ã
JavaScript 㯠Java ã C++ ããæ¥ãéçºè
ã«ã¨ã£ã¦ã¯å°ãæ¸æãããããã¾ããããªããªããJavaScript ã¯ãã¹ã¦åçã§ããã¹ã¦å®è¡æã§ãããéçãªåã¯ã¾ã£ãããªãããã§ãããã¹ã¦ããªãã¸ã§ã¯ãï¼ã¤ã³ã¹ã¿ã³ã¹ï¼ã颿°ï¼ã³ã³ã¹ãã©ã¯ã¿ã¼ï¼ã§ããã颿°èªä½ã Function ã³ã³ã¹ãã©ã¯ã¿ã¼ã®ã¤ã³ã¹ã¿ã³ã¹ã§ããæ§æã®æ§æè¦ç´ ã§ãããã¯ã©ã¹ãã§ãããå®è¡æã«ã¯ã³ã³ã¹ãã©ã¯ã¿ã¼é¢æ°ã«éããªãã®ã§ãã
JavaScript ã®ãã¹ã¦ã®ã³ã³ã¹ãã©ã¯ã¿ã¼é¢æ°ã¯ prototype ã¨ããç¹å¥ãªããããã£ãä¿æãã¦ããããã®ããããã£ã¯ new æ¼ç®åã¨çµã¿åããã¦åä½ãã¾ãããããã¿ã¤ããªãã¸ã§ã¯ãã¸ã®åç
§ã¯ãæ°ããã¤ã³ã¹ã¿ã³ã¹ã®å
é¨ãããã㣠[[Prototype]] ã«ã³ãã¼ããã¾ããä¾ãã°ã const a1 = new A() ã¨ããã¨ã JavaScript ã¯ï¼ãªãã¸ã§ã¯ããã¡ã¢ãªã¼ä¸ã§ä½æããå¾ã this ãå®ç¾©ãã颿° A() ãå®è¡ããåã«ï¼ a1.[[Prototype]] = A.prototype ãè¨å®ãã¾ãããã®å¾ãã¤ã³ã¹ã¿ã³ã¹ã®ããããã£ã«ã¢ã¯ã»ã¹ããã¨ãã JavaScript ã¯ã¾ããã®ãªãã¸ã§ã¯ãã«ç´æ¥åå¨ãããã©ããã調ã¹ãåå¨ããªãå ´å㯠[[Prototype]] ãæ¢ãã¾ããããªãã¡ã a1.doSomething, Object.getPrototypeOf(a1).doSomething, Object.getPrototypeOf(Object.getPrototypeOf(a1)).doSomething ãªã©ãè¦ã¤ããã¾ã§ãããã㯠Object.getPrototypeOf ã null ãè¿ãã¾ã§å帰çã«èª¿ã¹ããã¾ããããã¯ã prototype ã§å®ç¾©ããããã¹ã¦ã®ããããã£ããäºå®ä¸ãã¹ã¦ã®ã¤ã³ã¹ã¿ã³ã¹ã§å
±æãããå¾ã§prototypeã®ä¸é¨ã夿´ãã¦ãããã®å¤æ´ãæ¢åã®ãã¹ã¦ã®ã¤ã³ã¹ã¿ã³ã¹ã«ç¾ãããã¨ãæå³ãã¾ãã
ä¸ã®ä¾ã§ãconst a1 = new A(); const a2 = new A(); ã¨ããå ´åãa1.doSomething ã¯å®éã«ã¯ Object.getPrototypeOf(a1).doSomething ã¨ãªãã¾ã - ãã®å¤ã¯ãå®ç¾©ãã A.prototype ã¨åããã®ã§ãã ã¤ã¾ãã Object.getPrototypeOf(a1).doSomething === Object.getPrototypeOf(a2).doSomething === A.prototype.doSomething ã¨å®ç¾©ãããã¨ã«ãªãã¾ãã
ãããã¿ã¤ãç¶æ¿ã¢ãã«ã使ç¨ããè¤éãªã³ã¼ããæ¸ãåã«ããããã¿ã¤ãç¶æ¿ã¢ãã«ãçè§£ãããã¨ãéè¦ã§ããã¾ããã³ã¼ãä¸ã®ãããã¿ã¤ããã§ã¼ã³ã®é·ããæèããããã©ã¼ãã³ã¹ã®åé¡ãé¿ããããã«ãå¿ è¦ã«å¿ãã¦ãããåå²ãã¦ãã ãããããã«ããã¤ãã£ãã®ãããã¿ã¤ãã¯ãæ°ãã JavaScript ã®æ©è½ã¨ã®äºææ§ãã¨ãããã§ãªãéããæ±ºãã¦æ¡å¼µãã¦ã¯ããã¾ããã