Cosa sono i prototipi in JavaScript

In JavaScript, ogni oggetto ha un prototipo, che è essenzialmente un oggetto da cui eredita proprietà e metodi. Quando si cerca di accedere a una proprietà o a un metodo di un oggetto e questo non è presente nell'oggetto stesso, JavaScript cerca nel prototipo dell'oggetto padre e continua a risalire la "catena dei prototipi" fino a quando trova la proprietà o il metodo richiesto o raggiunge l'oggetto di base Object.prototype.

I prototipi sono fondamentali per la programmazione orientata agli oggetti in JavaScript. Permettono di condividere metodi e proprietà tra oggetti simili in modo efficiente, risparmiando memoria e semplificando la gestione del codice.

Un altro aspetto fondamentale è che JavaScript è un linguaggio basato su prototipi, il che significa che non ha classi tradizionali come altri linguaggi di programmazione. Invece, gli oggetti vengono creati come istanze di altri oggetti esistenti, utilizzando i prototipi come modello.

Creare un prototipo in javaScript

Per creare un prototipo in JavaScript, puoi utilizzare una funzione costruttrice o un oggetto letterale. Ecco un esempio utilizzando una funzione costruttrice:

function Animale(nome) {
	this.nome = nome;
}

Animale.prototype.saluta = function() {
	console.log(`Ciao, sono ${this.nome}!`);
};

const cane = new Animale("Fido");
cane.saluta(); // Stampa: 'Ciao, sono Fido!'

In questo esempio, abbiamo creato un prototipo Animale con una proprietà nome e un metodo saluta. Gli oggetti creati utilizzando new Animale() ereditano automaticamente sia la proprietà nome che il metodo saluta dal prototipo Animale.

Ereditarietà dei prototipi

Un vantaggio dei prototipi è la possibilità di creare catene di ereditarietà. Puoi estendere un prototipo esistente per creare un nuovo oggetto con proprietà e metodi aggiuntivi. Ecco un esempio:

function Animale(nome) {
	this.nome = nome;
}

Animale.prototype.saluta = function() {
	console.log(`Ciao, sono ${this.nome}!`);
};

function Uccello(nome, specie) {
	Animale.call(this, nome); // Chiama il costruttore di Animale
	this.specie = specie;
}

// Eredita i metodi di Animale
Uccello.prototype = Object.create(Animale.prototype);

Uccello.prototype.vola = function() {
	console.log(`${this.nome} sta volando!`);
};

const pappagallo = new Uccello("Polly", "Pappagallo");
pappagallo.saluta(); // Stampa: 'Ciao, sono Polly!'
pappagallo.vola();   // Stampa: 'Polly sta volando!'

In questo esempio, abbiamo creato un nuovo prototipo Uccello che eredita dal prototipo Animale. Questo ci consente di condividere il metodo saluta da Animale e aggiungere il metodo vola specifico per gli uccelli.