Даниэль Эренберг и Джефф Моррисон разработали 3-й этап предложения ECMAScript под названием «Функции статического класса» , который направлен на решение этой проблемы. Вместе с предложением этапа 3 «Поля классов» будущий код будет выглядеть следующим образом:
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();
}
}
Вышеуказанное эквивалентно:
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 поддерживает перенос полей класса через свойства @ babel / plugin- scheme -class (включен в предустановку stage-3 ), так что вы можете использовать эту функцию, даже если ваша среда выполнения JavaScript не поддерживает ее.
По сравнению с решением @kangax по объявлению геттера это решение также может быть более производительным, поскольку здесь доступ к свойству осуществляется напрямую, а не через вызов функции.
Если это предложение будет принято, появится возможность писать код JavaScript способом, более похожим на традиционные объектно-ориентированные языки, такие как Java и C♯.
Изменить : предложение унифицированных полей класса сейчас находится на этапе 3; обновление до пакетов Babel v7.x.
Изменить (февраль 2020 г.) : функции статического класса были разделены на другое предложение. Спасибо @ GOTO0!