澄清:Javascript原型更新混乱

Clarification: Javascript prototype update confusion

本文关键字:更新 混乱 原型 Javascript 澄清      更新时间:2023-09-26

可能的答案,但答案显示了观察到的情况,但并不能解释为什么会发生这种情况。

让我们创建三个函数构造函数。

function A() {
}
function B() {
}
function C() {
}
C.prototype.nm = "C";
B.prototype = new A()
var obj = new B()
B.prototype = new C()
console.log(obj.nm); // prints, undefined.

所以在最后一行之后,我期望"obj"从C的原型接收属性,但事实并非如此。那么,这是否意味着一旦创建了对象,它就与创建过程中指定的任何原型绑定在一起?为什么是这样,我的意思是,我可以通过原型接收对象的实时更新,但如果可以通过更改构造函数原型属性从多个对象获得更新,那不是更好吗?

这是否意味着一旦对象被创建,它就被绑定到任何东西上原型是在创作过程中分配的吗?

没错。对象在其[[Prototype]]内部属性中继承对象的属性。

该属性是在创建实例时设置的:

113.2.2[[Construct]]

  • proto为用参数"prototype"调用F的[[Get]]内部属性的值
  • 如果Type(proto)为Object,则将obj的[[Prototype]]内部属性设置为proto

但是,如果更改构造函数的prototype属性,则不会影响以前的实例。

事实上,prototype本身并不特殊,只是[[Construct]]内部方法在创建实例时使用了它。

一旦对象被创建,它就被绑定到它原来的原型上在创建期间分配?

大部分是的。您可以更改它,但不建议(因为性能问题),使用:

  • __proto__:这是Object.prototype中的一个非标准属性,可以用作[[Prototype]]的getter或setter。ECMAScript 6在附录B中对其进行了标准化(用于Web浏览器的附加ECMAScript特性)。

  • Object.setPrototypeOf是ECMAScript 6引入的一种新方法。

您没有为B分配任何特定的原型属性,因此继承链被破坏。