L'uso del prototipo in JavaScript è fondamentale per aggiungere proprietà e metodi a costruttori di oggetti, permettendo così a tutti gli oggetti creati da un determinato costruttore di condividere quelle proprietà e quei metodi. Ecco come puoi utilizzare il prototipo:
Prima di tutto, definisci una funzione costruttore. Gli oggetti vengono creati utilizzando questa funzione costruttore con la parola chiave new
.
function Persona(nome) {
this.nome = nome;
}
Invece di aggiungere metodi direttamente all'interno del costruttore (cosa che li replicherebbe in ogni istanza, occupando più memoria), puoi aggiungerli al prototipo del costruttore. In questo modo, tutti gli oggetti creati tramite il costruttore Persona
condivideranno lo stesso metodo, conservando memoria.
Persona.prototype.saluta = function() {
console.log(`Ciao, il mio nome è ${this.nome}!`);
};
Ora, ogni volta che crei un nuovo oggetto usando new Persona()
, quell'oggetto avrà accesso al metodo saluta
tramite la catena dei prototipi.
let persona1 = new Persona("Mario");
persona1.saluta(); // Output: "Ciao, il mio nome è Mario!"
let persona2 = new Persona("Luca");
persona2.saluta(); // Output: "Ciao, il mio nome è Luca!"
Puoi utilizzare il prototipo per realizzare anche l'ereditarietà tra funzioni costruttore.
function Impiegato(nome, ruolo) {
Persona.call(this, nome); // Chiama il costruttore di Persona
this.ruolo = ruolo;
}
// Imposta Impiegato.prototype per ereditare da Persona.prototype
Impiegato.prototype = Object.create(Persona.prototype);
// Re-imposta il costruttore di Impiegato sul suo costruttore originale
Impiegato.prototype.constructor = Impiegato;
// Aggiungi un nuovo metodo a Impiegato
Impiegato.prototype.mostraRuolo = function() {
console.log(`Il mio ruolo è ${this.ruolo}.`);
};
let impiegato1 = new Impiegato("Sara", "Ingegnere");
impiegato1.saluta(); // Output: "Ciao, il mio nome è Sara!"
impiegato1.mostraRuolo(); // Output: "Il mio ruolo è Ingegnere."
In questo esempio, Impiegato
eredita da Persona
tramite la catena dei prototipi. Usando Object.create(Persona.prototype)
, assicuri che Impiegato.prototype
abbia lo stesso prototipo di Persona
, consentendo così agli oggetti Impiegato
di accedere ai metodi definiti in Persona.prototype
, oltre a quelli specifici di Impiegato
.
L'uso del prototipo è molto potente ma può diventare complicato, soprattutto con l'ereditarietà prototipale. La sintassi delle classi introdotta in ES6 semplifica l'ereditarietà e la definizione di metodi, ma sotto il cofano, JavaScript usa ancora il prototipo per implementare queste caratteristiche.