'costruttore' non fa quello che sembra lo fa. Questo, oltre alla sua non-standard, è una buona ragione per non usarlo - bastone con instanceof e prototipo.
Tecnicamente: "costruttore" non è una proprietà dell'istanza "s", è una proprietà dell'oggetto prototipo "Sub" che mostra attraverso. Quando crei la funzione "Sub" in Mozilla, ottieni un oggetto Sub.prototype predefinito di nuova creazione che ha un "costruttore" che punta alla funzione Sub come cortesia.
Tuttavia, si sostituisce il prototipo con una nuova Base(). Il prototipo predefinito originale con il collegamento a Sub è perso; invece, Sub.prototype è un'istanza di Base senza alcuna proprietà di "costruzione" sovrascritta. Quindi:
new Sub().constructor===
Sub.prototype.constructor===
new Base().constructor===
Base.prototype.constructor===
Base
... fino all'oggetto più semplice il cui prototipo non è stato modificato.
È convenzionale/migliore?
Quando si tratta di oggetti/classi JavaScript non esiste una convenzione; il sistema di metaclassi di ogni biblioteca si comporta in modo leggermente diverso. Non ne ho visto uno che scrive "costruttore" su ogni classe derivata manualmente, ma sembra una buona soluzione come qualsiasi se si vuole veramente avere il vero costruttore disponibile; renderà anche il codice compatibile con i browser/motori che non ti danno 'costruttore'.
Prenderei in considerazione l'ipotesi di assegnare un nome diverso, per evitare confusione con la proprietà "costruttore" esistente e con un comportamento diverso.
Ho appena eseguito il confronto attraverso una pagina html come alert (s.constructor == Sub) e restituito vero. –
Molte framework regolano la proprietà 'constructor' su indica correttamente il costruttore della sottocategoria. Ho un post che tratta questo e altri problemi nel codice che hai mostrato sopra. http://js-bits.blogspot.com/2010/08/javascript-inheritance-done-right.html –