2014-10-04 4 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/

есть хорошая причина, почему Ьх не определен в конце?

Если это не ошибка, то как же x2 равен 1 в скрипке?

+2

Хотя ваш вопрос не имеет точно такого же кода, [этот вопрос] (http://stackoverflow.com/questions/19698533/creating-new-objects-from-frozen-parent-objects/19698581#19698581) объясняет, почему это так. –

ответ

2

This answer дает хорошее объяснение тому, что здесь происходит.

В частности, моя ошибка была в том, что я не понимал, что после этой линии

B.prototype = new A(); 

B.prototype стал объектом, который имел свойство «х» (то есть, несмотря на то, что B.prototype.x === undefined is true, B.prototype.hasOwnProperty ('x') также верен).

я изменил эту строку на это:

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

и это позволяет мне заморозить B.prototype, не нарушая конструктора цепочки.

Благодаря Quantas 94 Heavy для указания меня в правильном направлении.

Смежные вопросы