ES6课程中的成员变量

时间:2015-02-03 20:56:47

标签: javascript class member static-members ecmascript-6

有没有办法使用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";
}

但是这不起作用,因为根据the current spec draft ClassElement 的唯一产品是静态的,实例方法和分号都是自己的。好的,可以使用一对getter和setter方法来实现与我概述的类似语义,但我认为这会严重影响性能并且语法非常奇怪。

是否有一些草案建议以class表示法包含变量?如果是这样,建议的语法是什么,它在哪里发表,在哪里讨论,讨论是如何进行的,以及当前的事态是什么?目前的情况是,如果之前没有讨论过这样的问题,在任何层面上都无法回答这个问题,但我认为这不太可能。


一些背景知识:我目前正在使用谷歌封闭编译器执行高级编译,使用ES6作为输入。为了实现这一点,我需要一个地方来为成员变量添加我的类型注释,并且我曾经使用类似/** @type {string} */ MyClass.prototype.arg;的语法来放置它们,这是ECMAScript中的语义无操作但是向闭包编译器提供类型信息好,易于。我还没有用class构造找到一个同样好的方法。但如果你想解决这个问题,那就是评论。上面的问题是成员声明不仅仅是无操作,所以这里的答案应该讨论。

3 个答案:

答案 0 :(得分:40)

ES6几乎肯定不会涵盖定义类变量的语法。只能使用类语法定义方法和getter / setter。这意味着您仍然必须使用MyClass.classVariable = 42;路由获取类变量。

如果您只想初始化具有某些默认值的类,则可以使用丰富的新语法集来设置函数参数和解构默认值。举一个简单的例子:

class Foo {
    constructor(foo = 123) {
        this.foo = foo;
    }
}

new Foo().foo == 123
new Foo(42).foo == 42

答案 1 :(得分:7)

我还没有使用过Google Closure Compiler,但是使用Babel,您可以按照here所述声明static(范围为class)个变量。由于static成员对React的效用,本文主要关注React,但一般适用于ES6 class

语法接近您提出的语法:

class MyClass {
    constructor(arg) { if(arg) this.arg = arg; }
    static defaultArg = 42;
    let arg = MyClass.defaultArg;
}

请注意,您必须将'es7.classProperties'添加到.babelrc才能进行编译。有关详细信息,请参阅Babel 5.0.0 release notes

我不知道是否可以将static声明为const

答案 2 :(得分:3)

虽然它不是ES6规范的一部分,但这看起来很快就会到来,并且已经得到了Babel和其他一些人的支持。

以下是规范: https://github.com/jeffmo/es-class-fields-and-static-properties

所有提案及其状态的完整列表: https://github.com/tc39/ecma262