Domanda

Vedo molto codice come questo:

function Base() {}
function Sub() {}
Sub.prototype = new Base();

Tuttavia, se lo fai:

s = new Sub();
print(s.constructor == Sub);

Questo è falso. Questo mi sembra confuso, dato che il costruttore di s è, in effetti, Sub. È convenzionale / meglio farlo?

function Base() {}
function Sub() {}
Sub.prototype = new Base();
Sub.prototype.constructor = Sub;

o non importa davvero?

È stato utile?

Soluzione

'costruttore' non fa quello che sembra. Questo, oltre alla sua non standardità, è una buona ragione per evitare di usarlo - attenersi a instanceof e prototipo.

Tecnicamente: 'constructor' non è una proprietà dell'istanza 's', è una proprietà dell'oggetto prototipo 'Sub' che mostra attraverso. Quando si crea la funzione "Sottotitoli" in Mozilla, si ottiene un oggetto Sub.prototype predefinito appena coniato che ha un "costruttore" che rimanda alla funzione Sottotitoli come cortesia.

Comunque sostituisci quel 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à 'costruttore' prioritaria. 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 / meglio farlo?

Quando si tratta di oggetti / classi JavaScript non esiste una convenzione; il sistema di metaclasse di ogni libreria si comporta in modo leggermente diverso. Non ne ho visto uno che scriva "costruttore" manualmente per ogni classe derivata, ma sembra un'ottima soluzione come qualsiasi se si vuole davvero avere il vero costruttore disponibile; renderà anche il codice compatibile con browser / motori che non ti danno "costruttore".

Considererei di dargli un nome diverso, tuttavia, per evitare confusione con la proprietà "costruttore" esistente e con comportamenti diversi.

Altri suggerimenti

Se vuoi testare se un oggetto è esattamente un'istanza di Sub usa l'operatore instanceof : -

print(s instanceof Sub);

Se vuoi sapere se un oggetto è un'istanza di Sub o un'istanza di una sottoclasse di Sub usa il metodo isPrototypeOf : -

print(Sub.prototype.isPrototypeOf(s));

Si,

Sub.prototype.constructor = Sub;

usiamo instanceof ma c'è una soluzione migliore. Guarda qui:, TDD JS Eredità su GitHub e trova la Modello di ereditarietà parassitaria . Il codice è TDD, quindi dovresti essere in grado di farlo rapidamente e quindi cambiare semplicemente i nomi per iniziare. Questo è fondamentalmente ciò che utilizza YAHOO.lang.extend (fonte: dipendente e autore di yahoo JavaScript professionale di Nicholas Zakas per sviluppatori Web, 2 ° ED, pagina 181). Ottimo libro a proposito (non affiliato in alcun modo!)

Perché? Perché il modello classico con cui stai lavorando ha delle variabili di riferimento statiche (se crei var arr = [1,2] nell'oggetto base, TUTTE le istanze avranno lettura / scrittura e "condivideranno lo stato" di "arr"! Se usi il costruttore rubando puoi aggirare questo. Vedi i miei esempi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top