Існує пропозиція ECMAScript на 3 етапі під назвою "Особливості статичного класу" Даніеля Еренберга та Джеффа Моррісона, яка спрямована на вирішення цієї проблеми. Разом із пропозицією 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-пропозиція-клас-властивості (включені в пресет попереднього етапу 3 ), так що ви можете використовувати цю функцію, навіть якщо ваш час виконання JavaScript її не підтримує.
Порівняно з рішенням @ kangax щодо оголошення геттера, це рішення також може бути більш продуктивним, оскільки тут властивість доступна безпосередньо, а не через виклик функції.
Якщо ця пропозиція буде прийнята, тоді можна буде писати код JavaScript таким чином, який більше схожий на традиційні об'єктно-орієнтовані мови, такі як Java та C♯.
Змінити : пропозиція уніфікованих полів класу зараз знаходиться на етапі 3; оновлення до пакетів Babel v7.x.
Редагувати (лютий 2020) : Функції статичного класу були розділені на іншу пропозицію. Дякую @ GOTO0!