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.