有没有办法使用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
构造找到一个同样好的方法。但如果你想解决这个问题,那就是评论。上面的问题是成员声明不仅仅是无操作,所以这里的答案应该讨论。
答案 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