ES6 类中的成员变量

问题描述 投票:0回答:4

有没有办法使用 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 闭包编译器执行高级编译,使用 ES6 作为输入。为了实现这一点,我需要一个地方来放置成员变量的类型注释,并且我过去常常使用像

/** @type {string} */ MyClass.prototype.arg;
这样的语法来放置它们,这是 ECMAScript 中的语义无操作,但可以很好地向闭包编译器提供类型信息简单的。我还没有找到一种类似的好方法来使用
class
构造来做到这一点。但如果你想解决这个方面的问题,那将是一个评论。上面的问题是关于成员声明,这不仅仅是空操作,所以这就是这里的答案应该讨论的内容。

javascript class member static-members ecmascript-6
4个回答
49
投票

ES6 几乎肯定不会涵盖定义类变量的语法。只能使用类语法定义方法和 getter/setter。这意味着您仍然必须采用

MyClass.classVariable = 42;
路线来获取类变量。

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

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

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

7
投票

我没有使用过 Google Closure Compiler,但是使用 Babel,你可以声明

static
(作用域为
class
)变量,如此处所述。本文重点关注 React,因为
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


0
投票

如果您希望引用继承类的静态成员,但您还没有它的名称,则可以使用

this.constructor.variableName

class Parent {
    instanceVar = this.constructor.staticVar;
}

class Child extends Parent {
    static staticVar = 12;
}
© www.soinside.com 2019 - 2024. All rights reserved.