ããã°ã©ãã³ã°ã«ããã¦ããç¶æ¿ãã¨ã¯è¦ªããåã¸ã¨ç¹æ§ã渡ããã¨ãæããæ°ããã³ã¼ããæ¢åã®ã³ã¼ãã®æ©è½ãåå©ç¨ãããã®ä¸ã«æ§ç¯ã§ããããã«ãã¾ãã 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 ã®æ©è½ã¨ã®äºææ§ãã¨ãããã§ãªãéããæ±ºãã¦æ¡å¼µãã¦ã¯ããã¾ããã
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4