È male accedere al prototipo del costruttore all'interno del costruttore?

4

La maggior parte dei luoghi in cui ho visto i prototipi definiti per un costruttore è stato fatto in questo modo.

var Person = function(){
    this.stuff = stuff;
}
Person.prototype.doSomething = function(){console.log("something")}
var john = new Person();

Ma per me, provenendo da Java, sembra più intuitivo definirlo direttamente all'interno del costruttore.

var Person = function(){
    this.stuff = stuff;
Person.prototype.doSomething = function(){console.log("something")}
}
var john = new Person();

Ma il fatto di non averlo mai visto prima mi fa chiedere se c'è qualcosa di sbagliato nel farlo in quel modo. Causa problemi che non ho previsto?

    
posta Supetorus 06.08.2016 - 19:08
fonte

1 risposta

5

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

    
risposta data 07.08.2016 - 08:52
fonte

Leggi altre domande sui tag