Membri Statici delle Classi JavaScript
Impara le proprietà e i metodi statici in JavaScript: come definirli con la parola chiave static, ereditarli nelle sottoclassi, scrivere factory method, usare i blocchi di inizializzazione statici e come si comporta this.
Le proprietà e i metodi statici appartengono alla classe stessa, non alle istanze create da essa. Ciò significa che li si chiama direttamente sul nome della classe — senza mai scrivere new. Sono lo strumento giusto per le funzioni di utilità e le costanti condivise che riguardano la classe nel suo complesso, piuttosto che un singolo object.
Se hai già usato gli object predefiniti di JavaScript, hai usato membri statici senza nominarli come tali:
Date.now()restituisce il timestamp corrente — lo si chiama suDate, non su un'istanza di date.Array.from(iterable)costruisce un array — chiamato sulla classeArray, non su un array esistente.Object.keys(obj)elenca le chiavi proprie di un object — chiamato suObject.Math.max(...)eNumber.isInteger(...)sono anch'essi statici.
Questo capitolo spiega come definire le proprie proprietà e i propri metodi statici, come vengono ereditati dalle sottoclassi, come si comporta this al loro interno, e i pattern comuni (factory method e blocchi di inizializzazione statici) che utilizzerai nel codice reale. Se le classi sono nuove per te, inizia prima con la sintassi di base delle classi.
Definire Proprietà e Metodi Statici
Le proprietà e i metodi statici vengono definiti usando la parola chiave static all'interno del corpo di una classe. Ecco come definirli e usarli:
In questo esempio, pi è una proprietà statica e sum è un metodo statico della classe Calculator. È possibile accedervi direttamente tramite il nome della classe senza istanziarla.
Nota: la sintassi dei campi statici di classe (static pi = ...) richiede ES2022+ o un transpiler come Babel. Inoltre, un metodo statico non può accedere alle proprietà di un'istanza tramite this, perché appartiene alla classe stessa piuttosto che a una specifica istanza.
this All'Interno di un Metodo Statico
All'interno di un metodo statico, this fa riferimento alla classe, non a un'istanza. Questo consente a un metodo statico di chiamarne un altro o di leggere una proprietà statica della stessa classe:
Poiché this si risolve nella classe, lo stesso metodo statico si comporta diversamente a seconda di quale classe viene chiamato — un dettaglio fondamentale una volta che entra in gioco l'ereditarietà (vedi la sezione successiva).
Ereditare Membri Statici nelle Sottoclassi
Le proprietà e i metodi statici vengono ereditati. Quando una sottoclasse usa extends su una classe genitore, ottiene accesso ai membri statici del genitore e può chiamarli tramite il proprio nome:
Qui Advanced.sum è ereditato da Calculator. All'interno di Advanced.double, this è Advanced, quindi this.sum(...) trova sum risalendo la catena dei prototipi.
Poiché this punta alla classe su cui il metodo è stato chiamato, una sottoclasse può sovrascrivere un membro statico e gli altri metodi statici del genitore utilizzeranno la versione sovrascritta quando vengono chiamati tramite la sottoclasse:
Per ulteriori informazioni sull'estensione delle classi, vedi l'ereditarietà delle classi.
Factory Method Statici
Un pattern comune è il factory method: un metodo statico che costruisce e restituisce un'istanza della classe, spesso a partire da dati in un formato diverso. Questo mantiene la logica di costruzione in un unico posto con nome e rende il codice chiamante più leggibile.
Un esempio tipico è la creazione di un object da una string JSON o da un object semplice ricevuto da un'API:
Usare new this(...) invece di new User(...) significa che una sottoclasse che chiama fromJSON ottiene automaticamente un'istanza della sottoclasse stessa.
Quando Usare le Proprietà Statiche
Le proprietà statiche sono ideali per le costanti legate a una classe che rimangono invariate, indipendentemente dall'istanza della classe. Forniscono un modo per accedere a dati condivisi da qualsiasi parte del codice. Ad esempio, se hai una classe che gestisce le interazioni degli utenti, potresti avere una proprietà statica che definisce impostazioni o limiti predefiniti:
Per le costanti che non dovrebbero mai essere riassegnate dall'esterno della classe, considera di combinare i campi statici con i membri privati (static #secret = ...).
Blocchi di Inizializzazione Statici
A volte una proprietà statica necessita di più di una singola espressione per essere configurata — ad esempio, dipende da altri statici, richiede un ciclo o ha bisogno di un try/catch. ES2022 ha aggiunto i blocchi di inizializzazione statici (static { ... }) esattamente per questo. Il blocco viene eseguito una sola volta, quando la classe viene definita, con this legato alla classe:
È possibile avere più di un blocco statico, e vengono eseguiti nell'ordine del codice sorgente insieme agli inizializzatori dei campi statici. Sono ideali per la configurazione calcolata che sarebbe difficile esprimere come un singolo assegnamento di campo.
Vantaggi dell'Uso di Proprietà e Metodi Statici
- Efficienza di Memoria: Poiché le proprietà e i metodi statici sono legati alla classe stessa piuttosto che alle istanze, evitano la duplicazione di dati o funzioni per ogni object, il che può ridurre l'overhead di memoria quando vengono create molte istanze.
- Comodità: I metodi statici possono essere chiamati senza istanziare la classe, rendendoli comodi per le funzioni di utilità.
- Codice Organizzato: Raggruppando le funzionalità correlate direttamente all'interno delle classi come membri statici, il codice rimane organizzato e le aree funzionali sono chiaramente definite.
Riepilogo
- I membri statici vengono dichiarati con la parola chiave
statice risiedono sulla classe, non sulle istanze — li si chiama comeNomeClasse.membro. - I predefiniti familiari come
Date.now(),Array.from()eObject.keys()sono metodi statici. - All'interno di un metodo statico,
thisè la classe su cui è stato chiamato. Le sottoclassi ereditano i membri statici e possono sovrascriverli, ethissi risolve di conseguenza. - Usa i factory method (
static fromJSON(...)che restituiscenew this(...)) per centralizzare la costruzione di object, e i blocchi di inizializzazione statici (static { ... }, ES2022) per la configurazione che richiede più di una singola espressione. - Ricorri ai membri statici per le utilità e le costanti condivise; usa i metodi regolari (di istanza) per il comportamento che dipende dai dati di uno specifico object.
Prossimi passi
- Sintassi di base delle classi — le basi di
class, costruttori e metodi di istanza. - Ereditarietà delle classi — come funzionano
extendsesuper, anche con i membri statici. - Proprietà e metodi privati e protetti — combina
#privateconstaticper proteggere i dati a livello di classe.