Членские переменные в классах ES6
Можно ли использовать нотацию ECMAScript6 class
для объявления переменной статического класса или значения по умолчанию для переменной экземпляра? Без class
то, что я имею в виду, будет записано как
function MyClass(arg) { if(arg) this.arg = arg; }
MyClass.classVariable = 42;
MyClass.prototype.arg = "no arg specified";
Наиболее очевидным обозначением типа ES6, на мой взгляд, было бы
class MyClass {
constructor(arg) { if(arg) this.arg = arg; }
static let classVariable = 42;
let arg = "no arg specified";
}
Но это не сработает, так как согласно текущей спецификации проекта, только производные классы ClassElement являются статическими и экземплярами и точками с запятой самих себя. Хорошо, можно использовать пару методов getter и setter, чтобы достичь аналогичной семантики, что я изложил, но я предполагаю, что это серьезное снижение производительности и с действительно причудливым синтаксисом.
Есть ли какой-либо проект, который предполагает включение переменных в нотацию class
, так или иначе? Если да, то каков был предложенный синтаксис, где он был опубликован, где он обсуждался, как проходила дискуссия и каково нынешнее положение дел на этом фронте? Как бы то ни было, на этот вопрос нельзя ответить, если такое обсуждение не обсуждалось ранее, на любом уровне, но я считаю это маловероятным.
Немного фона: в настоящее время я играю с компилятором Google close, выполняющим расширенную компиляцию, используя ES6 в качестве входных данных. Для этого мне нужно место, чтобы поместить аннотации типов для переменных-членов, и я использовал их, используя синтаксис типа /** @type {string} */ MyClass.prototype.arg;
, который является семантическим no-op в ECMAScript, но предоставляет информацию о типе компилятору закрытия nice и легко. Я еще не нашел такой же хороший способ сделать это с помощью конструкции class
. Но если вы хотите рассмотреть этот аспект, это будет комментарий. Вышеупомянутый вопрос касается заявлений участников, которые больше, чем не-ops, так что здесь должен обсуждаться ответ.
Ответы
Ответ 1
ES6 почти наверняка не охватит синтаксис для определения переменных класса. Только методы и геттеры/сеттеры могут быть определены с использованием синтаксиса класса. Это означает, что вам все равно придется пройти маршрут MyClass.classVariable = 42;
для переменных класса.
Если вы просто хотите инициализировать класс с некоторыми значениями по умолчанию, существует богатый новый синтаксис для аргумента функции и деструктурирования значений по умолчанию, которые вы можете использовать. Чтобы привести простой пример:
class Foo {
constructor(foo = 123) {
this.foo = foo;
}
}
new Foo().foo == 123
new Foo(42).foo == 42
Ответ 2
Я не использовал компилятор Google Closure, но с Babel вы можете объявить переменные static
(с привязкой к class
), как описано здесь. Статья посвящена Реагированию из-за полезности членов static
для React, но применима к ES6 class
es вообще.
Синтаксис близок к вашему предложенному синтаксису:
class MyClass {
constructor(arg) { if(arg) this.arg = arg; }
static defaultArg = 42;
let arg = MyClass.defaultArg;
}
Обратите внимание, что вам нужно добавить 'es7.classProperties'
к вашему .babelrc
для компиляции. Подробнее см. заметки о выпуске Babel 5.0.0.
Я не знаю, есть ли способ объявить static
как const
.
Ответ 3
Пока он не входит в спецификацию ES6, похоже, что он скоро появится и уже поддерживается Babel и некоторыми другими.
Здесь спецификация:
https://github.com/jeffmo/es-class-fields-and-static-properties
И полный список всех предложений и их статус:
https://github.com/tc39/ecma262