Les membres statiques appartiennent à la classe, pas à l'instance
La plupart des méthodes que vous écrivez dans une classe travaillent sur une instance précise : un user en particulier, un circle en particulier. Les membres statiques, eux, fonctionnent autrement. Ils appartiennent à la classe elle-même. On les appelle via le nom de la classe, jamais sur une instance.
double appartient à MathUtils, pas aux instances créées à partir de cette classe. Instancier ne change rien — m.double renvoie undefined. C'est exactement l'inverse des méthodes classiques, qui vivent sur les instances (techniquement, sur le prototype) et restent invisibles depuis la classe elle-même.
Le modèle mental à retenir : le mot-clé class crée deux choses distinctes — un ensemble de méthodes d'instance (utilisées via new MathUtils()) et un ensemble de méthodes statiques (appelées directement sur MathUtils). Le mot-clé static sert justement à choisir dans quel panier ranger chaque membre.
L'usage classique : les méthodes factory
La raison la plus fréquente d'écrire une méthode statique en JavaScript, c'est de fournir un constructeur alternatif. Le vrai constructor prend les arguments qu'on lui donne, mais on a souvent besoin d'autres façons de construire un objet — à partir d'un JSON, d'une ligne de base de données, ou d'une URL.
fromJSON ne se sert pas d'un utilisateur, elle en fabrique un. C'est précisément le genre de cas où une méthode statique a tout son sens. L'alternative serait une fonction parseUser isolée, mais la garder rattachée à la classe regroupe les comportements liés et rend l'intention limpide au moment de l'appel.
Les propriétés statiques en JavaScript
On peut aussi rattacher des données directement à la classe elle-même :
Circle.PI est partagé par tous les cercles — c'est une constante attachée à la classe, pas une valeur recopiée dans chaque instance. Dans les méthodes d'instance, on y accède via le nom de la classe (Circle.PI), et surtout pas via this.
Les propriétés statiques sont très pratiques pour la configuration, les caches mutualisés entre instances, les compteurs ou encore les constantes liées à la classe.
this dans une méthode statique désigne la classe
Dans une méthode classique, this représente l'instance. Dans une méthode statique, this représente la classe elle-même :
À l'intérieur de increment, this.count fait référence à Counter.count. Ça peut sembler bizarre au début, mais c'est précisément ce qui permet à l'héritage des méthodes statiques de fonctionner : this pointe vers la classe sur laquelle la méthode a été appelée, pas vers celle qui l'a définie.
Héritage des méthodes statiques en JavaScript
Les méthodes statiques sont héritées par les sous-classes. Et comme this pointe vers la classe depuis laquelle on appelle la méthode, les méthodes factory renvoient automatiquement une instance de la bonne sous-classe :
Animal.create utilise new this(name). Quand tu appelles Dog.create("Rex"), this vaut Dog, donc new this(name) crée bien un Dog. Si tu écrivais new Animal(name) à la place, tu obtiendrais toujours un Animal, ce qui casserait complètement le pattern. C'est précisément pour ça que this dans une méthode statique pointe vers la classe.
Méthode statique vs méthode d'instance : comparaison concrète
Voici la même logique, écrite dans les deux styles pour bien voir la différence :
Les deux font exactement le même calcul. La version d'instance lit ses données depuis this.celsius, tandis que la version statique reçoit son entrée via un argument. Utilisez la méthode d'instance quand l'opération est « quelque chose que cet objet fait » ; utilisez la méthode statique quand c'est « quelque chose que la classe sait calculer à partir d'entrées ».
Le bloc static pour l'initialisation
Parfois, initialiser une propriété statique demande plus qu'une simple expression : une boucle, une condition, plusieurs valeurs qui dépendent les unes des autres. C'est précisément à ça que servent les blocs static :
Un bloc static { ... } s'exécute une seule fois, au moment où la classe est définie. À l'intérieur, this fait référence à la classe elle-même. C'est pratique pour une initialisation en plusieurs étapes ; pour une simple affectation, un champ statique classique reste plus lisible.
Membres statiques privés
Les champs statiques peuvent eux aussi être privés, grâce au préfixe #. Ils ne sont alors accessibles que depuis l'intérieur de la classe :
#nextId est scellé à l'intérieur de la classe. Du code extérieur peut appeler IdGenerator.next(), mais ne peut ni lire ni réinitialiser le compteur. Les champs privés auront bientôt leur propre page, mais il est bon de savoir dès maintenant que la combinaison static + # fonctionne.
Quand éviter static
Les méthodes statiques sont pratiques pour regrouper des helpers, mais ce n'est pas une raison pour transformer chaque utilitaire en classe. Si vous avez un fichier rempli de fonctions indépendantes, exportez-les directement — inutile de les envelopper dans une classe composée uniquement de méthodes statiques pour leur donner un namespace. Un module fait déjà ce travail, et il le fait plus proprement.
Optez pour static quand :
- La fonction appartient réellement à la classe (factory, convertisseur, validateur propre à ce type).
- Vous avez besoin d'un état partagé entre toutes les instances de la classe.
- Une sous-classe pourrait vouloir surcharger ou hériter du comportement.
Sinon, une simple fonction reste l'outil le plus adapté.
La suite : les champs privés
Vous avez aperçu #nextId — c'est la syntaxe des champs privés en JavaScript. Elle fonctionne aussi bien pour les membres d'instance que pour les membres statiques, et c'est la façon moderne de cacher les détails d'implémentation à l'intérieur d'une classe. C'est le sujet du prochain chapitre.
Questions fréquentes
C'est quoi une méthode statique en JavaScript ?
Une méthode statique appartient à la classe elle-même, pas à ses instances. On la déclare avec le mot-clé static et on l'appelle directement sur la classe : MaClasse.faireUnTruc(). Les instances n'y ont pas accès via this.faireUnTruc() — seule la classe peut l'appeler.
Quand choisir une méthode statique plutôt qu'une méthode d'instance ?
Utilise une méthode statique quand la fonction est liée à la classe mais n'a pas besoin de lire ou modifier une instance précise. Les cas typiques : les méthodes factory du genre User.fromJSON(...), les utilitaires comme Math.max, ou encore des constantes regroupées dans la classe façon namespace. Si ta méthode a besoin que this pointe vers une instance, c'est une méthode d'instance.
Une méthode statique peut-elle accéder aux propriétés d'une instance ?
Pas directement. Dans une méthode statique, this fait référence à la classe, pas à une instance — donc this.name lit une propriété statique, pas un champ d'instance. Si tu as besoin des données de l'instance, passe-la en argument : static summarize(user) { return user.name; }.
Les méthodes statiques sont-elles héritées en JavaScript ?
Oui. Quand une sous-classe étend une classe parente avec extends, les méthodes statiques du parent sont aussi disponibles sur la sous-classe. Dans une méthode statique, this référence la classe sur laquelle tu l'as appelée — c'est exactement ce qui permet aux méthodes factory statiques de fonctionner correctement à travers les sous-classes.