如果您更改了Constructor.prototype
,则在更改之前创建的Constructor
实例将把旧的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
发布于 2020-08-11 20:17:28
[[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";
https://stackoverflow.com/questions/63365333
复制相似问题