Classi

JavaScript supporta il concetto di classi come sintassi per la creazione di oggetti. Le classi specificano le proprietà e i metodi che gli stessi oggetti creati da una classe avranno.

Quando un oggetto viene creato in base alla classe, il nuovo oggetto viene indicato come istanza della classe. Le nuove istanze vengono create utilizzando la parola new.

L'esempio sotto mostra una classe che rappresenta una Canzone. Un nuovo oggetto chiamato miaCanzone viene creato sotto e poi il metodo .play() viene richiamato.

class Canzone {
   constructor() {
     this.title;
     this.author; 
   }
 
   play() {
     console.log('Sta suonando la canzone!');
   }
}

const miaCanzone = new Canzone();
miaCanzone.play();

Le proprietà negli oggetti sono separate da virgole. Questo non avviene nella classe, inoltre, i metodi nelle classi non hanno separatori tra loro.

Costruttore di classe

Le classi possono avere il metodo constructor. Questo è un metodo speciale che viene chiamato quando l'oggetto viene creato (istanziato). I metodi costruttore sono solitamente usati per impostare i valori iniziali dell'oggetto.

class Canzone {
   constructor(titolo, autore) {
     this.titolo = titolo;
     this.autore = autore;
   }
}

const miaCanzone = new Canzone('Nothing else matter', 'Metallica');
console.log(miaCanzone.titolo);

Metodi statici

All'interno di una classe JavaScript, la parola chiave static definisce un metodo statico per una classe. I metodi statici non sono chiamati su singole istanze della classe, ma sono chiamati sulla classe stessa. Pertanto, essi tendono ad essere metodi generali (di utilità).

class Cane {
   constructor(nome) {
     this._nome = nome;  
   }

   presenta() {
     console.log('Questo è ' + this._nome + ' !');  
   }

   // Un metodo statico
   static abbaia() {
     console.log('BauBau!');  
   }
}

const mioCane = new Cane('Bob');
mioCane.presenta();

// Chiamo il metodo statico
Cane.abbaia();

Extends

Le classi JavaScript supportano il concetto di eredità, una classe figlia può ampliare una classe genitore. Questo si ottiene utilizzando la parola chiave extends come parte della definizione della classe.

Le classi figlie hanno accesso a tutte le proprietà di istanza e ai metodi della classe genitore. Possono aggiungere le proprie proprietà ed i propri metodi. Un costruttore di classi figlio chiama il costruttore della classe genitore usando il metodo super().

// Classe genitore

class Media {
   constructor(info) {
     this.dataPubb = info.dataPubb;
     this.nome = info.nome;
   }
}

// Classe figlia
class Canzone extends Media {
   constructor(canzoneData) {
     super(canzoneData);
     this.autore = canzoneData.autore;
   }
}

const myCanzone = new Canzone({
   autore: 'Queen',
   nome: 'Bohemian Rhapsody',
   dataPubb: 1975
});