Es gibt einen ECMAScript-Vorschlag der Stufe 3 mit dem Titel "Static Class Features" von Daniel Ehrenberg und Jeff Morrison, mit dem dieses Problem gelöst werden soll. Zusammen mit dem Vorschlag für Stufe 3 "Klassenfelder" sieht der zukünftige Code folgendermaßen aus:
class MyClass {
static myStaticProp = 42;
myProp = 42;
myProp2 = this.myProp;
myBoundFunc = () => { console.log(this.myProp); };
constructor() {
console.log(MyClass.myStaticProp); // Prints '42'
console.log(this.myProp); // Prints '42'
this.myBoundFunc(); // Prints '42'
}
}
Das Obige entspricht:
class MyClass {
constructor() {
this.myProp = 42;
this.myProp2 = this.myProp;
this.myBoundFunc = () => { console.log(this.myProp); };
console.log(MyClass.myStaticProp); // Prints '42'
console.log(this.myProp); // Prints '42'
this.myBoundFunc(); // Prints '42'
}
}
MyClass.myStaticProp = 42;
Babel unterstützt das Transpilieren von Klassenfeldern über @ babel / plugin-comment-class-properties (in der Voreinstellung für Stufe 3 enthalten ), sodass Sie diese Funktion auch dann verwenden können, wenn Ihre JavaScript-Laufzeit dies nicht unterstützt.
Im Vergleich zu @ kangax 'Lösung, einen Getter zu deklarieren, kann diese Lösung auch leistungsfähiger sein, da hier direkt auf die Eigenschaft zugegriffen wird, anstatt eine Funktion aufzurufen.
Wenn dieser Vorschlag angenommen wird, kann JavaScript-Code auf eine Weise geschrieben werden, die herkömmlichen objektorientierten Sprachen wie Java und C♯ ähnlicher ist.
Bearbeiten : Ein Vorschlag für einheitliche Klassenfelder befindet sich jetzt in Phase 3. Update auf Babel v7.x-Pakete.
Bearbeiten (Februar 2020) : Die statischen Klassenfunktionen wurden in einen anderen Vorschlag aufgeteilt. Danke @ GOTO0!