澄清:Javascript原型更新混乱

时间:2015-03-01 20:05:41

标签: javascript prototype

Possible answer,但是答案显示了观察到的内容,但没有解释为什么会发生这种情况。

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

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的原型接收属性但不是。那么它是否意味着一旦创建了对象,它就会与创建期间分配的原型相关联?为什么会这样,我的意思是我可以通过原型接收对象的实时更新,但如果只是更改构造函数原型属性可以从多个对象获取更新会更好吗?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

  

这是否意味着一旦创建了对象,它就会被绑定   它是在创作期间分配的原型吗?

是的,确切地说。对象在[[Prototype]]内部属性中继承对象的属性。

创建实例时设置了该属性:

  

13.2.2 [[Construct]]

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

但是如果你改变了构造函数的prototype属性,它就不会影响以前的实例。

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

  

创建对象后,它与任何原型相关联   在创作期间分配?

大多数情况下是的。您可以更改它,但不建议(因为性能问题),使用:

  • __proto__:这是Object.prototype中的非标准属性,可以用作[[Prototype]]的getter或setter。附件B中的ECMAScript 6 standardized it(Web浏览器的其他ECMAScript功能)。

  • Object.setPrototypeOf,ECMAScript 6引入的新方法。