Il existe une proposition ECMAScript Stage 3 appelée "Static Class Features" par Daniel Ehrenberg et Jeff Morrison qui vise à résoudre ce problème. Avec la proposition "Champs de classe" de l'étape 3 , le futur code ressemblera à ceci:
class MyClass {
static myStaticProp = 42;
myProp = 42;
myProp2 = this.myProp;
myBoundFunc = () => { console.log(this.myProp); };
constructor() {
console.log(MyClass.myStaticProp);
console.log(this.myProp);
this.myBoundFunc();
}
}
Ce qui précède est équivalent à:
class MyClass {
constructor() {
this.myProp = 42;
this.myProp2 = this.myProp;
this.myBoundFunc = () => { console.log(this.myProp); };
console.log(MyClass.myStaticProp);
console.log(this.myProp);
this.myBoundFunc();
}
}
MyClass.myStaticProp = 42;
Babel prend en charge la transpilation des champs de classe via @ babel / plugin-proposal-class-properties (inclus dans le préréglage stage-3 ), afin que vous puissiez utiliser cette fonctionnalité même si votre environnement d'exécution JavaScript ne la prend pas en charge.
Comparée à la solution de @ kangax de déclarer un getter, cette solution peut également être plus performante, car ici la propriété est accédée directement au lieu d'appeler une fonction.
Si cette proposition est acceptée, il sera alors possible d'écrire du code JavaScript d'une manière plus similaire aux langages orientés objet traditionnels tels que Java et C♯.
Edit : Une proposition de champs de classe unifiée est maintenant à l'étape 3; mise à jour vers les packages Babel v7.x.
Edit (février 2020) : Les fonctionnalités de classe statique ont été divisées en une proposition différente. Merci @ GOTO0!