W3docs

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 su Date, non su un'istanza di date.
  • Array.from(iterable) costruisce un array — chiamato sulla classe Array, non su un array esistente.
  • Object.keys(obj) elenca le chiavi proprie di un object — chiamato su Object.
  • Math.max(...) e Number.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:


javascript— editable

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:


javascript— editable

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:


javascript— editable

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:


javascript— editable

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:


javascript— editable

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:


javascript— editable

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:


javascript— editable

È 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.
  • I membri statici vengono dichiarati con la parola chiave static e risiedono sulla classe, non sulle istanze — li si chiama come NomeClasse.membro.
  • I predefiniti familiari come Date.now(), Array.from() e Object.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, e this si risolve di conseguenza.
  • Usa i factory method (static fromJSON(...) che restituisce new 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

Pratica

Pratica
Quali affermazioni sono vere riguardo alle proprietà e ai metodi statici in JavaScript?
Quali affermazioni sono vere riguardo alle proprietà e ai metodi statici in JavaScript?
Was this page helpful?