ES6 中的成员变量 类

Member variables in ES6 classes

有什么方法可以使用 ECMAScript6 class 符号来声明静态 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 draftClassElement 的唯一产品是静态方法和实例方法以及分号本身。好的,可以使用一对 getter 和 setter 方法来实现与我概述的相似的语义,但我想这会导致严重的性能损失和非常奇怪的语法。

是否有一些草案建议在 class 符号中以某种方式包含变量?如果是这样,建议的语法是什么,在哪里发布,在哪里讨论,讨论进行得如何,这方面的现状如何?就目前而言,如果之前没有在任何级别讨论过此类问题,则无法回答这个问题,但我认为这不太可能。


一些背景知识:我目前正在使用 Google 闭包编译器执行高级编译,使用 ES6 作为输入。为此,我需要一个地方来放置成员变量的类型注释,我过去常常使用 /** @type {string} */ MyClass.prototype.arg; 之类的语法来放置它们,这是 ECMAScript 中的语义空操作,但会向闭包编译器提供类型信息好,易于。我还没有找到使用 class 构造来执行此操作的类似好方法。但是,如果您想解决这方面的问题,那就是评论。上面的问题是关于不仅仅是空操作的成员声明,​​所以这就是这里的答案应该讨论的内容。

ES6 几乎肯定不会涵盖定义 class 变量的语法。只有方法和 getters/setters 可以使用 class 语法定义。这意味着您仍然需要为 class 变量走 MyClass.classVariable = 42; 路线。

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

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

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

我没有使用 Google Closure Compiler,但是使用 Babel 你可以声明 static(作用域为 class)变量,如 here 所述。由于 static 成员对 React 的实用性,本文主要关注 React,但一般适用于 ES6 classes。

语法接近您建议的语法:

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

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

规格如下: https://github.com/jeffmo/es-class-fields-and-static-properties

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