L'intero punto di impostare una funzione su un "costruttore" in JavaScript è tale da essere impostato per la catena di prototipi quando si accede a un'istanza.
Esempio A function Foo() {...}
Foo.prototype.bar = function () {...}
var foo = new Foo();
foo.bar(); //references the shared function on the constructor
In alternativa, le funzioni possono essere impostate direttamente sulle istanze nel costruttore.
Esempio B function Foo() {
this.bar = function () {...};
}
var foo = new Foo();
foo.bar(); //references the function set directly on the instance
La differenza tra questi due metodi consiste nel modo in cui vengono create molte funzioni.
La generazione di mille istanze di Foo
nell'esempio A avrà esattamente un % metodobar
definito e usato per le istanze tutte .
La generazione di mille istanze di Foo
nell'esempio B avrà un migliaio di metodi creati. Uno per ogni istanza. Questo può essere utile per accedere alle variabili con scope, ma viene fornito con l'ovvio costo delle prestazioni.
Se invece aggiungi la funzione al prototipo all'interno del costruttore ...
Esempio C: (non farlo mai) function Foo() {
Foo.prototype.bar = function () {...};
}
var foo = new Foo();
foo.bar(); //references the shared function on the constructor
Ottieni il peggiore dei due metodi . Non sei completamente in grado di utilizzare variabili scope, poiché il prototipo è condiviso, quindi ogni istanza sovrascriverà la funzione e l'ambito disponibili e genererai una nuova funzione per ogni istanza, e stai buttando via tutte le funzioni esistenti.
Non scrivere mai JavaScript in questo modo.
tl; dr:
Is it bad to access the constructor prototype within the constructor?
Si