Подтвердить что ты не робот

Членские переменные в классах 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, так что здесь должен обсуждаться ответ.

4b9b3361

Ответ 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.