javascript - 冻结构造函数原型的副作用

时间:2014-10-04 02:28:26

标签: javascript prototype freeze

我注意到冻结构造函数的原型有副作用,基本上破坏了构造函数链接:

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/

有没有充分的理由说明为什么b.x最后未定义?

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

1 个答案:

答案 0 :(得分:2)

This answer为这里发生的事情提供了一个很好的解释。

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

B.prototype = new A();

B.prototype成为具有'x'属性的对象(即尽管B.prototype.x === undefined为真,但B.prototype.hasOwnProperty('x')也是如此)。< / p>

我将上面一行更改为:

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

这允许我在不破坏构造函数链的情况下冻结B.prototype。

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