JavaScript: classi e oggetti in ECMAScript 6

ECMAScript 6 introduce le classi in JavaScript nelle versioni più recenti del linguaggio.

Iniziamo col dire che il supporto alle classi non comprende tutte le feature OO pure presenti in linguaggi come Java (modificatori di visibilità, classi astratte, ecc.) ma le seguenti funzionalità:

  1. La parola chiave class.
  2. Costruttori tramite il metodo constructor().
  3. Metodi statici (di classe) tramite la parola chiave static.
  4. La parola chiave extends per il supporto all’ereditarietà singola.
  5. Il costrutto super()per l’accesso alla classe genitrice.

In sostanza non si è abbandonato l’approccio basato su prototipi che ha sempre caratterizzato JavaScript ma si è preferito estendere le funzionalità esistenti.

Una classe può presentarsi così:

'use strict';

class Employee {
    constructor(name, salary) {
        this.name = name;
        this.salary = salary;
    }
} 

Possiamo instanziare questa classe nel modo a cui siamo già abituati:

let johnDoe = new Employee('John Doe',1800);
johnDoe.salary; // 1800

I metodi e le proprietà, non disponendo di operatori di visibilità, sono tutti pubblici e i metodi vengono definiti senza far ricorso alla parola chiave function:

'use strict';

class Employee {
    constructor(name, salary) {
        this.name = name;
        this.salary = salary;
    }

    getSalary() { return this.salary; }

    raiseSalary(amount) {
        if(typeof amount === 'number') {
            this.salary += amount;
        } 
    }
} 

I metodi non statici sono metodi di istanza e vanno usati con un’istanza della classe.

let johnDoe = new Employee('John Doe',1800);
johnDoe.raiseSalary(200);
johnDoe.getSalary(); // 2000

I metodi statici, al contrario, sono metodi che appartengono alla classe, e vanno usati direttamente col nome della classe.

'use strict';

class Auth {
    static getNonce() {
        let chars = 'ABCDEF0123456789';
        return chars.split('').sort(() => 	{ return Math.random() - 0.5; }).join(''); 
    }
}

Auth.getNonce(); // 'E5F1CD4A972036B8'

A ben vedere le classi sono piuttosto limitate se si vuole cercare di adottare un approccio OO classico. Di fatto le si può utilizzare come wrapper per aggregare dati e operazioni in moduli specifici, ma i limiti evidenti impediscono di rinunciare all’approccio funzionale o a quello object-based basato sui prototipi a cui siamo già abituati.

Torna su