Object.setPrototypeOf()
Baseline
åºãå©ç¨å¯è½
ãã®æ©è½ã¯åºãå®è£ ããã¦ãããå¤ãã®ãã¼ã¸ã§ã³ã®ç«¯æ«ããã©ã¦ã¶ã¼ã§åä½ãã¾ãã2015å¹´9æä»¥éããã¹ã¦ã®ãã©ã¦ã¶ã¼ã§å©ç¨å¯è½ã§ãã
Object.setPrototypeOf() ã¯éçã¡ã½ããã§ãæå®ããããªãã¸ã§ã¯ãã®ãããã¿ã¤ãï¼ã¤ã¾ããå
é¨ã® [[Prototype]] ããããã£ï¼ããå¥ã®ãªãã¸ã§ã¯ãã¾ã㯠null ã«è¨å®ãã¾ãã
è¦å:
ãªãã¸ã§ã¯ãã® [[Prototype]] ã夿´ããã¨ã æè¿ã® JavaScript ã¨ã³ã¸ã³ãããããã£ã¸ã®ã¢ã¯ã»ã¹ãæé©åããæ¹æ³ã®ç¹è³ªä¸ããã¹ã¦ã®ãã©ã¦ã¶ã¼ã JavaScript ã¨ã³ã¸ã³ã§ãæä½ãã¨ã¦ãä½éã«ãªãã¾ããããã«ããããã¿ã¤ãã夿´ãããã¨ã®æ§è½ã¸ã®å½±é¿ã¯ç´°ããåºç¯å²ã«ãããã Object.setPrototypeOf(...) æã«è²»ããããæéã ãã§ã¯ãªãã [[Prototype]] ã夿´ããããã¹ã¦ã®ãªãã¸ã§ã¯ãã¸ã®ã¢ã¯ã»ã¹ãæã¤ãã¹ã¦ã®ã³ã¼ãã«å½±é¿ããå¯è½æ§ãããã¾ãã詳ãã㯠JavaScript engine fundamentals: optimizing prototypes ããèªã¿ãã ããã
ãã®æ©è½ã¯è¨èªã®ä¸é¨ã§ããããããã®æ©è½ã®å®è£
ã«ããè² è·ã¯ (ç念ä¸ã¯) ã¨ã³ã¸ã³ã®éçºè
ã«ããã¾ããã¨ã³ã¸ã³ã®éçºè
ããã®åé¡ã«å¯¾å¦ããã¾ã§ã®éãæ§è½ãæ°ã«ãªãå ´åã¯ããªãã¸ã§ã¯ãã® [[Prototype]] ã夿´ãããã¨ã¯é¿ããã¹ãã§ãã代ããã«ã Object.create() ã使ç¨ãã¦å¿
è¦ãª [[Prototype]] ããã¤ãªãã¸ã§ã¯ããçæãã¦ãã ããã
試ãã¦ã¿ã¾ããã
const obj = {};
const parent = { foo: "bar" };
console.log(obj.foo);
// äºæ³ãããçµæ: undefined
Object.setPrototypeOf(obj, parent);
console.log(obj.foo);
// äºæ³ãããçµæ: "bar"
æ§æ
Object.setPrototypeOf(obj, prototype)
弿°
è¿å¤
æå®ããããªãã¸ã§ã¯ãã
ä¾å¤
TypeError-
以ä¸ã®ããããã®å ´åã«çºçãã¾ãã
- 弿°
objãundefinedã¾ãã¯nullã§ããå ´åã - 弿°
objãæ¡å¼µä¸å¯è½ã§ããããã¾ãã¯ãããã¿ã¤ããä¸å¤ã®ã¨ãã¾ããã¯ãªãã¸ã§ã¯ããä¾ãã°Object.prototypeãwindowçã®å ´åããã ããæ°ãããããã¿ã¤ããobjã®å ã®ãããã¿ã¤ãã¨åãå¤ã§ããå ´åã¯ãã¨ã©ã¼ã¯çºçãã¾ããã - 弿°
prototypeããªãã¸ã§ã¯ãã¾ãã¯nullã§ã¯ãªãå ´åã
- 弿°
解説
Object.setPrototypeOf() ã¯ãä¸è¬çã«ãªãã¸ã§ã¯ãã®ãããã¿ã¤ããè¨å®ããããã®é©åãªæ¹æ³ã¨èãããã¦ãã¾ããéæ¨å¥¨ã® Object.prototype.__proto__ ã¢ã¯ã»ãµã¼ã®ä»£ããã«ã常ã«ããã使ç¨ããã¹ãã§ãããã
ãã弿° obj ããªãã¸ã§ã¯ãï¼ä¾ãã°ãæ°å¤ãæååãªã©ï¼ã§ãªãå ´åããã®ã¡ã½ããã¯ä½ãããããªãã¸ã§ã¯ãã«å¤æãããããããã¿ã¤ããè¨å®ãããã¨ãªããç´æ¥ obj ãããªããã£ãå¤ã¨ãã¦è¿ãã¾ãããã prototype ã obj ã®ãããã¿ã¤ãã¨åãå¤ã§ããã°ã obj ã®ãããã¿ã¤ããä¸å¤ã§ãã£ã¦ã TypeError ã¯çºçããã« obj ãç´æ¥è¿ããã¾ãã
ã»ãã¥ãªãã£ã®è¦³ç¹ããããããã¿ã¤ããä¸å¤ã§ããããã«è¨è¨ãããçµã¿è¾¼ã¿ãªãã¸ã§ã¯ããããã¾ããããã«ããããããã¿ã¤ãæ±ææ»æãç¹ã«ãããã·ã¼é¢é£ã®æ»æãé²ããã¨ãã§ãã¾ããã³ã¢è¨èªã§ã¯ãä¸å¤ã®ãããã¿ã¤ããæã¤ã¨ãã¾ããã¯ãªãã¸ã§ã¯ãã¨ã㦠Object.prototype ã®ã¿ãæå®ãã¦ããããã®ãããã¿ã¤ãã¯å¸¸ã« null ã§ãããã©ã¦ã¶ã¼ã§ã¯ã window ã location ã® 2 ã¤ãã¨ã¦ãä¸è¬çãªä¾ã§ãã
Object.isExtensible(Object.prototype); // trueãããããã£ã追å ã§ãã
Object.setPrototypeOf(Object.prototype, {}); // TypeError: ä¸å¤ã®ãããã¿ã¤ããªãã¸ã§ã¯ã '#<Object>' ã«ãããã¿ã¤ããè¨å®ãããã¨ã¯ã§ããªã
Object.setPrototypeOf(Object.prototype, null); // ã¨ã©ã¼ãªãã `Object.prototype` ã®ããããã£ããã§ã« `null` ã§ãããã
ä¾
>Object.setPrototypeOf() ã使ã£ãæ¬ä¼¼ã¯ã©ã¹ç¶æ¿
ã¯ã©ã¹ã使ç¨ãã JS ã®ç¶æ¿ã§ãã
class Human {}
class SuperHero extends Human {}
const superMan = new SuperHero();
ãããã class ã使ããã«ãµãã¯ã©ã¹ãå®è£
ãããå ´åã¯ã次ã®ããã«ãã¾ãã
function Human(name, level) {
this.name = name;
this.level = level;
}
function SuperHero(name, level) {
Human.call(this, name, level);
}
Object.setPrototypeOf(SuperHero.prototype, Human.prototype);
// `SuperHero.prototype` ã® `[[Prototype]]` ã `Human.prototype` ã«è¨å®
// ãããã¿ã¤ãã®ã¤ã³ã¹ã¿ã³ã¹ãã§ã¼ã³ãè¨å®ãããã
Human.prototype.speak = function () {
return `${this.name} says hello.`;
};
SuperHero.prototype.fly = function () {
return `${this.name} is flying.`;
};
const superMan = new SuperHero("Clark Kent", 1);
console.log(superMan.fly());
console.log(superMan.speak());
ä¸è¨ã®ãããªå¤å
¸çç¶æ¿ï¼ã¯ã©ã¹ã«ããç¶æ¿ï¼ã¨æ¬ä¼¼å¤å
¸çç¶æ¿ï¼ã³ã³ã¹ãã©ã¯ã¿ã¼ã® prototype ããããã£ã«ããç¶æ¿ï¼ã®é¡ä¼¼æ§ã«ã¤ãã¦ã¯ãç¶æ¿ãã§ã¼ã³ã§è¿°ã¹ããã¦ãã¾ãã
颿°ã³ã³ã¹ãã©ã¯ã¿ã¼ã® prototype ããããã£ã¯æ¸ãè¾¼ã¿å¯è½ãªã®ã§ã Object.create() ã§ä½æããæ°ãããªãã¸ã§ã¯ãã«åå²ãå½ã¦ãããã¨ã§ãåãç¶æ¿é£éãå®ç¾ã§ãã¾ãã create() ã使ç¨ããéã«ã¯ã constructor ããããã£ãå度追å ãããã¨ãå¿ããªãããã«ãããªã©ã®æ³¨æç¹ãããã¾ãã
以ä¸ã®ä¾ã§ãã¯ã©ã¹ã使ç¨ãã¦ãã¾ããã SuperHero 㯠extends ã使ç¨ããã«ã代ããã« setPrototypeOf() ã使ç¨ã㦠Human ãç¶æ¿ãã¦ãã¾ãã
è¦å:
extends ã®ä»£ããã« setPrototypeOf() ã使ããã¨ã¯ãããã©ã¼ãã³ã¹ãå¯èªæ§ã®ç¹ãããå§ãã§ãã¾ããã
class Human {}
class SuperHero {}
// ç¶æ¿ããããã£ãè¨å®
Object.setPrototypeOf(SuperHero.prototype, Human.prototype);
// éçããããã£ãããã¯
Object.setPrototypeOf(SuperHero, Human);
const superMan = new SuperHero();
extends ã使ããªããµãã¯ã©ã¹åã¯ã ES-6 subclassing ã§è§¦ãããã¦ãã¾ãã
仿§æ¸
| 仿§æ¸ |
|---|
| ECMAScript® 2027 Language Specification > # sec-object.setprototypeof > |