首页 > 解决方案 > 实例的 [[prototype]] 插槽如何以及为什么在它们被制作的时间点包含 Constructor.prototype(并且没有得到“更新”)?

问题描述

如果您更改Constructor.prototypeConstructor您在更改之前所做的实例将“存储”旧的实例Constructor.prototype在他们的[[prototype]]插槽中。

function F() {
}

o1 = new F();

F.prototype = {color: "red"};

o2 = new F();

console.log(o1) //it's [[proto]] contains old Object.prototype.
console.log(o2) //it's [[proto]] contains {color: "red"}.

我的印象是[[prototype]]插槽引用Object.prototype。它如何捕捉旧的Object.prototype

标签: javascript

解决方案


插槽没有什么神奇之处[[proto]],它就像任何其他对象属性一样,它可以包含对对象的引用。它不直接链接到F.prototype插槽,它只是在创建对象时获取对该插槽的值的引用。

因此,重新分配F.prototype插槽对原型对象的其他引用没有影响,就像任何其他对象属性一样:

o1 = { prop1: {a: 1}}
o2 = { prop1: o1.prop1 }
console.log(o2.prop1.a) // prints 1
o1.prop1 = {a: 2}
console.log(o2.prop1.a) // still prints 1

这就是为什么我们F.prototype在创建类的实例后通常不重新签名的原因。相反,我们分配给 ; 的属性F.prototype。因为所有的实例都引用了这个对象,所以修改它会影响所有的实例。

所以在你的例子中你会这样做:

F.prototype.color = "red";

推荐阅读