2014-10-04 84 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爲我指出正確的方向。

相關問題