🧑🏻‍💻 Written by Riccardo Genova
JavaScriptClassi vs Prototype

Metodi in una Classe VS prototype

Quando definisci un metodo all’interno di una classe o di una funzione costruttore, ogni volta che crei un’istanza di quella classe o costruttore, una nuova copia del metodo viene creata e assegnata a ciascuna istanza. Questo approccio aumenta l’utilizzo della memoria perché ogni istanza mantiene la sua copia unica del metodo, anche se la logica del metodo è esattamente la stessa per ogni istanza.

Esempio con metodo definito all’interno del costruttore:

function Persona(nome) {
  this.nome = nome;
  this.saluta = function () {
    console.log(`Ciao, il mio nome è ${this.nome}!`);
  };
}

In questo caso, ogni volta che crei un nuovo oggetto Persona, viene creata una nuova funzione saluta per quell’oggetto.

D’altro canto, quando aggiungi un metodo al prototipo di una classe o di una funzione costruttore, tutte le istanze create da quella classe o costruttore condividono lo stesso metodo. Questo metodo è definito una sola volta nella memoria e ogni istanza accede a questo metodo tramite la catena dei prototipi. Ciò è più efficiente in termini di memoria, specialmente quando hai molte istanze della stessa classe.

Esempio con metodo aggiunto al prototipo:

function Persona(nome) {
  this.nome = nome;
}
 
Persona.prototype.saluta = function () {
  console.log(`Ciao, il mio nome è ${this.nome}!`);
};

In questo secondo caso, il metodo saluta è definito una sola volta, indipendentemente da quante istanze di Persona vengano create. Ogni istanza di Persona può usare saluta, ma non c’è una copia separata del metodo saluta per ogni istanza.

Questo approccio è più efficiente in termini di memoria e segue il principio DRY (“Don’t Repeat Yourself”), poiché il codice del metodo è definito una sola volta ma può essere utilizzato da molteplici istanze.