bis ES5 Es gibt eine Stufe 3 ECMAScript Vorschlag "Class Fields" von Daniel Ehrenberg und Jeff Morrison genannt, die dieses Problem lösen soll.
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'
}
}
Die oben 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;
Babelsupports transpiling Klassenfelder durch @babel/plugin-proposal-class-properties (im stage-3 preset enthalten), so dass Sie diese Funktion auch Laufzeit nicht unterstützt, wenn Ihr JavaScript verwenden können es.
Im Vergleich zu @ kangax-Lösung einen Getter zu erklären, kann diese Lösung auch performanter sein, da hier die Eigenschaft direkt von durch den Aufruf einer Funktion statt zugegriffen wird.
Wenn dieser Vorschlag akzeptiert wird, dann wird es möglich sein, JavaScript-Code in einer Weise zu schreiben, die traditionellen objektorientierten Sprachen wie Java und C♯ ähnlicher ist.
bearbeitet: Ein einheitliches Klassenfelder Vorschlag ist jetzt in der Stufe 3; Update auf Babel v7.x-Pakete.
Welche ECMAScript 6-Motor Implementierung verwenden Sie? – Dai
@Dai https://github.com/ModuleLoader/es6-module-loader – acbabis