Membres statiques des classes JavaScript
Apprenez les propriétés et méthodes statiques JavaScript : mot-clé static, héritage dans les sous-classes, méthodes factory, blocs d'initialisation statiques et comportement de this.
Les propriétés et méthodes statiques appartiennent à la classe elle-même, et non aux instances créées à partir d'elle. Cela signifie que vous les appelez directement sur le nom de la classe — sans jamais écrire new. Elles constituent l'outil idéal pour les fonctions utilitaires et les constantes partagées qui concernent la classe dans son ensemble plutôt qu'un objet particulier.
Si vous avez déjà utilisé les objets intégrés de JavaScript, vous avez utilisé des membres statiques sans les désigner comme tels :
Date.now()renvoie l'horodatage actuel — vous l'appelez surDate, pas sur une instance de date.Array.from(iterable)construit un array — appelé sur la classeArray, pas sur un array existant.Object.keys(obj)liste les clés propres d'un object — appelé surObject.Math.max(...)etNumber.isInteger(...)sont également statiques.
Ce chapitre explique comment définir vos propres propriétés et méthodes statiques, comment elles sont héritées par les sous-classes, comment this se comporte à l'intérieur d'elles, et les patterns courants (méthodes factory et blocs d'initialisation statiques) que vous utiliserez dans du code réel. Si les classes sont nouvelles pour vous, commencez par la syntaxe de base des classes.
Définir des propriétés et méthodes statiques
Les propriétés et méthodes statiques sont définies à l'aide du mot-clé static à l'intérieur du corps d'une classe. Voici comment les définir et les utiliser :
Dans cet exemple, pi est une propriété statique et sum est une méthode statique de la classe Calculator. Elles sont accessibles directement via le nom de la classe sans l'instancier.
Remarque : la syntaxe des champs de classe statiques (static pi = ...) nécessite ES2022+ ou un transpileur comme Babel. De plus, une méthode statique ne peut pas accéder aux propriétés d'une instance via this, car elle appartient à la classe elle-même plutôt qu'à une instance particulière.
this à l'intérieur d'une méthode statique
À l'intérieur d'une méthode statique, this fait référence à la classe, et non à une instance. Cela permet à une méthode statique d'en appeler une autre ou de lire une propriété statique de la même classe :
Comme this se résout en la classe, la même méthode statique se comporte différemment selon la classe par laquelle elle est appelée — un détail important dès lors que l'héritage entre en jeu (voir la section suivante).
Héritage des membres statiques dans les sous-classes
Les propriétés et méthodes statiques sont héritées. Quand une sous-classe étend (extends) une classe parente, elle accède aux membres statiques du parent et peut les appeler via son propre nom :
Ici, Advanced.sum est hérité de Calculator. À l'intérieur de Advanced.double, this est Advanced, donc this.sum(...) remonte la chaîne de prototype pour trouver sum.
Parce que this pointe sur la classe sur laquelle la méthode a été appelée, une sous-classe peut substituer un membre statique et les autres méthodes statiques du parent utiliseront la version substituée lorsqu'elles sont appelées via la sous-classe :
Pour en savoir plus sur l'extension des classes, consultez l'héritage de classe.
Méthodes factory statiques
Un pattern courant est la méthode factory : une méthode statique qui construit et renvoie une instance de la classe, souvent à partir de données sous une forme différente. Cela centralise la logique de construction en un seul endroit nommé et rend le code appelant plus lisible.
Un exemple typique est la création d'un object à partir d'une chaîne JSON ou d'un object simple reçu d'une API :
L'utilisation de new this(...) au lieu de new User(...) signifie qu'une sous-classe appelant fromJSON obtient automatiquement une instance de la sous-classe.
Quand utiliser les propriétés statiques
Les propriétés statiques sont idéales pour les constantes liées à une classe qui restent inchangées, quelle que soit l'instance. Elles permettent d'accéder à des données partagées depuis n'importe quel endroit de votre code. Par exemple, si vous avez une classe qui gère les interactions utilisateur, vous pouvez avoir une propriété statique qui définit des paramètres par défaut ou des limites :
Pour les constantes qui ne doivent jamais être réassignées depuis l'extérieur de la classe, envisagez de combiner les champs statiques avec les membres privés (static #secret = ...).
Blocs d'initialisation statiques
Parfois, une propriété statique nécessite plus qu'une simple expression pour être configurée — par exemple, elle dépend de plusieurs autres membres statiques, nécessite une boucle ou a besoin d'un try/catch. ES2022 a ajouté les blocs d'initialisation statiques (static { ... }) précisément pour cela. Le bloc s'exécute une seule fois, lors de la définition de la classe, avec this lié à la classe :
Vous pouvez avoir plusieurs blocs statiques, et ils s'exécutent dans l'ordre du source, aux côtés des initialiseurs de champs statiques. Ils sont idéaux pour les configurations calculées qui seraient difficiles à exprimer sous la forme d'une seule affectation de champ.
Avantages de l'utilisation des propriétés et méthodes statiques
- Efficacité mémoire : puisque les propriétés et méthodes statiques sont liées à la classe elle-même plutôt qu'aux instances, elles évitent de dupliquer des données ou des fonctions pour chaque object, ce qui peut réduire la charge mémoire lorsque de nombreuses instances sont créées.
- Commodité : les méthodes statiques peuvent être appelées sans instancier la classe, ce qui les rend pratiques pour les fonctions utilitaires.
- Code organisé : en regroupant les fonctionnalités connexes directement dans les classes en tant que membres statiques, le code reste organisé et les domaines fonctionnels sont clairement définis.
Résumé
- Les membres statiques sont déclarés avec le mot-clé
staticet résident sur la classe, pas sur les instances — appelez-les commeNomClasse.membre. - Les built-ins familiers comme
Date.now(),Array.from()etObject.keys()sont des méthodes statiques. - À l'intérieur d'une méthode statique,
thisest la classe sur laquelle elle a été appelée. Les sous-classes héritent des membres statiques et peuvent les substituer, etthisse résout en conséquence. - Utilisez les méthodes factory (
static fromJSON(...)renvoyantnew this(...)) pour centraliser la construction d'objects, et les blocs d'initialisation statiques (static { ... }, ES2022) pour la configuration qui nécessite plus qu'une seule expression. - Utilisez les membres statiques pour les utilitaires et les constantes partagées ; utilisez les méthodes régulières (d'instance) pour le comportement qui dépend des données d'un object spécifique.
Prochaines étapes
- Syntaxe de base des classes — les fondements de
class, des constructeurs et des méthodes d'instance. - Héritage de classe — comment
extendsetsuperfonctionnent, y compris avec les membres statiques. - Propriétés et méthodes privées et protégées — combiner
#privateavecstaticpour protéger les données au niveau de la classe.