有没有办法使用 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
构造来做到这一点。但如果你想解决这个方面的问题,那将是一个评论。上面的问题是关于成员声明,这不仅仅是空操作,所以这就是这里的答案应该讨论的内容。
ES6 几乎肯定不会涵盖定义类变量的语法。只能使用类语法定义方法和 getter/setter。这意味着您仍然必须采用
MyClass.classVariable = 42;
路线来获取类变量。
如果您只想使用一些默认值初始化类,可以使用丰富的函数参数和解构默认值的新语法集。举个简单的例子:
class Foo {
constructor(foo = 123) {
this.foo = foo;
}
}
new Foo().foo == 123
new Foo(42).foo == 42
我没有使用过 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
。
虽然它不是 ES6 规范的一部分,但看起来它即将推出,并且已经得到 Babel 和其他一些人的支持。
这是规格: https://github.com/jeffmo/es-class-fields-and-static-properties
以及所有提案及其状态的完整列表: https://github.com/tc39/ecma262
如果您希望引用继承类的静态成员,但您还没有它的名称,则可以使用
this.constructor.variableName
。
class Parent {
instanceVar = this.constructor.staticVar;
}
class Child extends Parent {
static staticVar = 12;
}