2011-02-09 13 views
16

In JavaScript Prototipo ereditarietà, qual è l'obiettivo dell'aggiunta della proprietà prototype.constructor. Lasciatemi spiegare con un esempio.Vantaggi dell'impostazione della proprietà "costruttore" nel "prototipo"

 
var Super = function() { 
    this.superProperty = 'Super Property' 
} 
var Sub = function() { 
    this.subProperty = 'Sub Property' 
} 

Sub.prototype = new Super(); 
Sub.prototype.constructor = Sub; // advantages of the statement 

var inst = new Sub(); 

Le righe seguenti restituiscono sempre true in ogni caso, quando si aggiunge Sub.prototype.constructor = Sub o no.

 
console.log(inst instanceof Sub) // true 
console.log(inst instanceof Super) // true 

Suppongo che possa essere utile quando si ricevono nuove istanze ma quando e/o come?

Grazie in anticipo.

+2

ottima domanda! – tybro0103

risposta

10

È sufficiente ripristinare correttamente la proprietà constructor per riflettere con precisione la funzione utilizzata per costruire l'oggetto.

Sub.prototype = new Super(); 

console.log(new Sub().constructor == Sub); 
// -> 'false' 

Sub.prototype.constructor = Sub; 
console.log(new Sub().constructor == Sub); 
// -> 'true' 
+2

Che cosa è esattamente la conseguenza di non impostarlo? O in altre parole, quando conta davvero il valore di Sub.prototype.constructor? Non sembra influenzare la creazione di istanze di Sub, afaics. Questa deve essere una di quelle cose che sono "così ovvie" che nessuno in realtà lo dichiara a titolo definitivo, e quindi mi ha eluso :-) – Yetanotherjosh

+6

@Yetanotherjosh: beh, nel caso del codice OP, se lascia quella linea, quindi 'inst.constructor === Super', anche se è stato istanziato con' new Sub() '. Questo in genere non sarebbe un problema se non ti interessa questa proprietà, ma se tu stessi condividendo l'istanza con un altro codice, in alcuni casi potresti creare confusione, incluso il caso in cui 'new inst.constructor()' risulterebbe in effetti in un'istanza di 'Super()' e non 'Sub()' (quindi mancano le proprietà esclusive di 'Sub.prototype'). ** tl; dr è una buona pratica di programmazione **. –

Problemi correlati