Esiste una proposta di Stage 3 ECMAScript chiamata "Static Class Features" di Daniel Ehrenberg e Jeff Morrison che mira a risolvere questo problema. Insieme alla proposta Stage 3 "Campi classe" , il codice futuro sarà simile a questo:
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();
}
}
Quanto sopra è equivalente a:
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 supporta il transpiling dei campi della classe tramite @ babel / plugin-proposta-class-properties (incluso nel preset stage-3 ), in modo che tu possa utilizzare questa funzione anche se il tuo runtime JavaScript non la supporta.
Rispetto alla soluzione di @ kangax di dichiarare un getter, questa soluzione può anche essere più performante, poiché qui si accede direttamente alla proprietà invece che chiamando una funzione.
Se questa proposta viene accettata, sarà possibile scrivere codice JavaScript in un modo più simile ai tradizionali linguaggi orientati agli oggetti come Java e C♯.
Modifica : una proposta di campi di classe unificata è ora nella fase 3; aggiornamento ai pacchetti Babel v7.x.
Modifica (febbraio 2020) : i privilegi di classe statici sono stati suddivisi in una proposta diversa. Grazie @ GOTO0!