2014-10-04 49 views
7

我注意到,冻结构造函数的原型有一个副作用,基本上打破了构造函数链:的JavaScript - 冻结构造函数原型的副作用

function A(x) { 
    this.x=x; 
} 

function B(x, y) { 
    A.call(this, x); 
    this.y=y; 
} 
B.prototype = new A(); 
Object.freeze(B.prototype); 
b=new B(1,2) 
// I expected b.x to be 1 here but it's undefined 

这里是展示问题的一个小提琴:

http://jsfiddle.net/jhpxv20b/2/

为什么bx在末尾没有定义是否有充分的理由?

如果这不是一个错误,那么x2是如何在小提琴中1?

+2

虽然你的问题没有完全一样的代码,但是这个问题没有完全相同的代码,[this question](http://stackoverflow.com/questions/19698533/creating-new-objects-from-frozen-parent-objects/19698581#19698581)解释了为什么是这种情况。 – 2014-10-04 02:39:07

回答

2

This answer对这里发生的事情给出了很好的解释。

特别是我的错误是,我并没有意识到这行后

B.prototype = new A(); 

B.prototype成为一个对象,它有一个“X”属性(即尽管B.prototype.x ===未定义为真,B.prototype.hasOwnProperty('x')也是如此)。

我改变了上面的行这样的:

B.prototype = Object.create(A.prototype); 

,这让我冻结B.prototype不破坏构造函数链。

感谢Quantas 94 Heavy为我指出正确的方向。

相关问题