2014-10-04 14 views
7

ho notato che il congelamento del prototipo di una funzione di costruzione ha avuto un effetto collaterale che, in fondo ha rotto costruttore concatenamento:javascript - Gli effetti collaterali di congelamento un prototipo costruttore

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 

Ecco un violino per dimostrare il problema:

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

c'è una buona ragione per cui bx è indefinito alla fine?

Se questo non è un bug, allora come mai x2 è 1 nel violino?

+2

Sebbene la tua domanda non abbia esattamente lo stesso codice, [questa domanda] (http://stackoverflow.com/questions/19698533/creating-new-objects-from-frozen-parent-objects/19698581#19698581) spiega perché questo è il caso. –

risposta

2

This answer fornisce una buona spiegazione per ciò che sta accadendo qui.

In particolare, il mio errore era che non mi rendevo conto che, dopo questa linea

B.prototype = new A(); 

B.prototype è diventato un oggetto che ha avuto una 'x' di proprietà (cioè, nonostante il fatto che B.prototype.x === undefined è vero, B.prototype.hasOwnProperty ('x') è anche vero).

ho cambiato la linea di cui sopra a questo:

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

e questo mi permette di congelare B.prototype senza rompere la concatenazione costruttore.

Grazie a Quantas 94 Heavy per avermi indirizzato nella giusta direzione.

Problemi correlati