Object.prototype.__proto__
鿍奍;: ãã®æ©è½ã¯éæ¨å¥¨ã«ãªãã¾ãããã¾ã 対å¿ãã¦ãããã©ã¦ã¶ã¼ãããããããã¾ãããããã§ã«é¢é£ããã¦ã§ãæ¨æºããåé¤ããã¦ããããåé¤ã®æç¶ãä¸ã§ããããäºææ§ã®ããã ãã«æ®ããã¦ããå¯è½æ§ãããã¾ãã使ç¨ãé¿ããã§ããã°æ¢åã®ã³ã¼ãã¯æ´æ°ãã¦ãã ããããã®ãã¼ã¸ã®ä¸é¨ã«ããäºææ§ä¸è¦§è¡¨ãè¦ã¦å¤æãã¦ãã ããããã®æ©è½ã¯çªç¶åä½ããªããªãå¯è½æ§ããããã¨ã«æ³¨æãã¦ãã ããã
è¦å:
ãªãã¸ã§ã¯ãã® [[Prototype]] ã夿´ãããã¨ã¯ãç¾è¡ã® JavaScript ã¨ã³ã¸ã³ãããããã£ã¢ã¯ã»ã¹ãæé©åããæ§è³ªä¸ãã©ã®ãã©ã¦ã¶ã¼ã JavaScript ã¨ã³ã¸ã³ã§ãç¾å¨ã¨ã¦ãé
ãå¦çã¨ãªãã¾ããããã«ãç¶æ¿ã夿´ãããã¨ã®å¹æã¯å¾®å¦ã§åºç¯å²ã«åã³ã obj.__proto__ = ... æã«è²»ããããæéã«éããã[[Prototype]] ã夿´ããããªãã¸ã§ã¯ãã«ã¢ã¯ã»ã¹ããããããã³ã¼ãã«åã¶å¯è½æ§ãããã¾ãã詳ãã㯠JavaScript engine fundamentals: optimizing prototypes ã§èª¬æããã¦ãã¾ãã
ã¡ã¢:
__proto__ ã使ç¨ãããã¨ã¯è°è«ã®ä½å°ããããæ¨å¥¨ããã¾ããããã®åå¨ã¨æ£ç¢ºãªåä½ã¯ãã¦ã§ãã®äºææ§ã確å®ã«ä¿æããããã®å¤ãæ©è½ã¨ãã¦æ¨æºåãããã ãã§ãããã»ãã¥ãªãã£ä¸ã®ããã¤ãã®èª²é¡ã¨è¶³ããã表示ãã¦ãã¾ãã対å¿ãããããããããã«ã¯ã Object.getPrototypeOf()/Reflect.getPrototypeOf() ã Object.setPrototypeOf()/Reflect.setPrototypeOf() ãæ¨å¥¨ãã¾ãã
__proto__ 㯠Object ã®ã¢ã¯ã»ãµã¼ãããã㣠(ã²ãã¿ã¼é¢æ°ããã³ã»ãã¿ã¼é¢æ°) ã§ãã¢ã¯ã»ã¹ããããªãã¸ã§ã¯ãã®å
é¨ã® [[Prototype]] ï¼ãªãã¸ã§ã¯ãã¾ã㯠null ã®ã©ã¡ããï¼ãæ´é²ãã¾ãã
ãªãã¸ã§ã¯ããªãã©ã«å®ç¾©å
ã§ __proto__ ããããã£ã使ç¨ãããã¨ã§ããªãã¸ã§ã¯ãã®ä½ææã«ãªãã¸ã§ã¯ã [[Prototype]] ãè¨å®ãããã¨ãã§ãã Object.create() ã®ä»£ããã«ãªãã¾ãããªãã¸ã§ã¯ãåæåå / ãªãã©ã«ã®æ§æãåç
§ãã¦ãã ããããã®æ§æã¯æ¨æºã§ãããå®è£
ã«æé©åããã¦ããã Object.prototype.__proto__ ã¨ã¯å
¨ãç°ãªãã¾ãã
æ§æ
obj.__proto__
è¿å¤
ã²ãã¿ã¼ã¨ãã¦ä½¿ç¨ãããå ´åããªãã¸ã§ã¯ãã® [[Prototype]] ãè¿ãã¾ãã
ä¾å¤
TypeError-
æ¡å¼µä¸å¯ã®ãªãã¸ã§ã¯ããã¾ãã¯ä¸å¤ãããã¿ã¤ãã¨ãã¾ããã¯ãªãã¸ã§ã¯ããä¾ãã°
Object.prototypeãwindowãªã©ã®ãããã¿ã¤ããè¨å®ãããã¨ããã¨çºçãã¾ãã
解説
__proto__ ã²ãã¿ã¼é¢æ°ã¯ãªãã¸ã§ã¯ãã®å
é¨ã® [[Prototype]] ã®å¤ãå¤é¨ã«å
¬éãã¾ãããªãã¸ã§ã¯ããªãã©ã«ã使ç¨ãã¦çæããããªãã¸ã§ã¯ãã§ã¯ï¼ãããã¿ã¤ãã»ãã¿ã¼æ§æã使ç¨ããªãéãï¼ããã®å¤ã¯ Object.prototype ã§ããé
åãªãã©ã«ã使ç¨ãã¦ä½æãããªãã¸ã§ã¯ãã®å ´åããã®å¤ã¯ Array.prototype ã§ãã颿°ã®å ´åããã®å¤ã¯ Function.prototype ã§ãããããã¿ã¤ããã§ã¼ã³ã«ã¤ãã¦ã¯ãç¶æ¿ã¨ãããã¿ã¤ããã§ã¼ã³ã§è©³ãã説æãã¦ãã¾ãã
__proto__ ã®ã»ãã¿ã¼ã§ãªãã¸ã§ã¯ãã® [[Prototype]] ã夿´ãããã¨ãã§ãã¾ããä¸ããããå¤ã¯ãªãã¸ã§ã¯ããã¾ã㯠null ã§ããå¿
è¦ãããã¾ããä»ã®å¤ãä¸ããããå ´åã¯ä½ããã¾ããã
Object.getPrototypeOf() ã Object.setPrototypeOf() 㯠Object ã®éçããããã£ã¨ãã¦å¸¸ã«å©ç¨ã§ãã常㫠[[Prototype]] ã®å
é¨ããããã£ãåæ ãã¾ããã __proto__ ããããã£ã¯ãã¹ã¦ã®ãªãã¸ã§ã¯ãã®ããããã£ã¨ãã¦å¸¸ã«åå¨ããããã§ã¯ãªããçµæã¨ã㦠[[Prototype]] ã確å®ã«åæ ããããã§ã¯ããã¾ããã
__proto__ ããããã£ã¯ãã²ãã¿ã¼é¢æ°ã¨ã»ãã¿ã¼é¢æ°ãããªã Object.prototype ä¸ã®ã¢ã¯ã»ãµã¼ããããã£ã§ããæçµçã«ã® Object.prototype ãåç
§ãã __proto__ ã«å¯¾ãã¦ã®ããããã£ã¢ã¯ã»ã¹ã¯ãã®ããããã£ãæ¢ãã¾ãããããã Object.prototype ãåç
§ããªãã¢ã¯ã»ã¹ã¯ãã®ããããã£ãæ¢ãã¾ããã Object.prototype ãåç
§ãããåã«ããã¤ãã®ä»ã® __proto__ ããããã£ãè¦ã¤ããããå ´åããã®ããããã£ã¯ã Object.prototype ä¸ã§è¦ã¤ããããããããã£ãé ãã¾ãã
null ãããã¿ã¤ããªãã¸ã§ã¯ãã¯ã __proto__ ã¢ã¯ã»ãµã¼ããããã£ãå«ãã Object.prototype ããããããã£ãç¶æ¿ããªãããããã®ãããªãªãã¸ã§ã¯ãã§ __proto__ ãèªã¿è¾¼ããã¨ããã¨ããªãã¸ã§ã¯ãã®å®éã® [[Prototype]] ã«é¢ä¿ãªããå¤ã¯å¸¸ã« undefined ã¨ãªãã __proto__ ã«ä»£å
¥ããã¨ããªãã¸ã§ã¯ãã®ãããã¿ã¤ããè¨å®ãã代ããã«ã __proto__ ã¨ããæ°ããããããã£ã使ãããã¨ã«ãªãã¾ããããã«ã __proto__ ã¯ãã»ãã¿ã¼ãçºçããããã¨ãªãã Object.defineProperty() ã«ãã£ã¦ãä»»æã®ãªãã¸ã§ã¯ãã¤ã³ã¹ã¿ã³ã¹ä¸ã®èªåèªèº«ã§ããããã£ã¨ãã¦åå®ç¾©ãããã¨ãã§ãã¾ãããã®å ´åã __proto__ 㯠[[Prototype]] ã®ã¢ã¯ã»ãµã¼ã«ã§ããªããªãã¾ãããã§ããã°ããªãã¸ã§ã¯ãã® [[Prototype]] ãè¨å®ãããåå¾ãããããã«ã¯ã常㫠Object.getPrototypeOf() 㨠Object.setPrototypeOf() ãæ¨å¥¨ãã¾ãã
ä¾
>__proto__ ã®ä½¿ç¨
function Circle() {}
const shape = {};
const circle = new Circle();
// ãªãã¸ã§ã¯ããããã¿ã¤ãã®è¨å®
// 鿍奍ã åèç¨ã§ãã å®éã®ã³ã¼ãã§ä½¿ç¨ããªãã§ãã ããã
shape.__proto__ = circle;
// ãªãã¸ã§ã¯ããããã¿ã¤ãã®åå¾
console.log(shape.__proto__ === Circle); // false
function ShapeA() {}
const ShapeB = {
a() {
console.log("aaa");
},
};
ShapeA.prototype.__proto__ = ShapeB;
console.log(ShapeA.prototype.__proto__); // { a: [Function: a] }
const shapeA = new ShapeA();
shapeA.a(); // aaa
console.log(ShapeA.prototype === shapeA.__proto__); // true
function ShapeC() {}
const ShapeD = {
a() {
console.log("a");
},
};
const shapeC = new ShapeC();
shapeC.__proto__ = ShapeD;
shapeC.a(); // a
console.log(ShapeC.prototype === shapeC.__proto__); // false
function Test() {}
Test.prototype.myName = function () {
console.log("myName");
};
const test = new Test();
console.log(test.__proto__ === Test.prototype); // true
test.myName(); // myName
const obj = {};
obj.__proto__ = Test.prototype;
obj.myName(); // myName
仿§æ¸
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-object.prototype.__proto__> |