MvG*_*MvG 32 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";
Run Code Online (Sandbox Code Playgroud)
在我看来,最明显的类似ES6的符号本来就是
class MyClass {
constructor(arg) { if(arg) this.arg = arg; }
static let classVariable = 42;
let arg = "no arg specified";
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为根据当前的规范草案,ClassElement的唯一产品是静态的,实例方法和分号都是它们自己.好吧,可以使用一对getter和setter方法来实现与我概述的类似语义,但我认为这会严重影响性能并且语法非常奇怪.
是否有一些草案建议在class表示法中包含变量,不管怎样?如果是这样,建议的语法是什么,它在哪里发布,在哪里讨论,讨论是如何进行的,以及当前的事态是什么?目前的情况是,如果之前没有讨论过这样的问题,在任何层面都无法回答这个问题,但我认为这不太可能.
一点背景:我目前正在使用谷歌闭包编译器执行高级编译,使用ES6作为输入.为了实现这一点,我需要一个地方来为成员变量添加类型注释,并且我曾经使用语法来放置它们,就像/** @type {string} */ MyClass.prototype.arg;ECMAScript中的语义无操作一样,但是为闭包编译器提供类型信息很简单.我还没有找到一个用class构造做同样好的方法.但如果你想解决这个问题,那就是评论.上面的问题是关于成员声明,而不是无操作,所以这里应该讨论的答案.
lys*_*ing 43
ES6几乎肯定不会涵盖定义类变量的语法.只能使用类语法定义方法和getter/setter.这意味着你仍然需要走路MyClass.classVariable = 42;类变量的路线.
如果您只想初始化具有某些默认值的类,则可以使用丰富的新语法集来设置函数参数和解构默认值.举个简单的例子:
class Foo {
constructor(foo = 123) {
this.foo = foo;
}
}
new Foo().foo == 123
new Foo(42).foo == 42
Run Code Online (Sandbox Code Playgroud)
我没有使用谷歌关闭编译器,但巴贝尔你可以声明static(范围限定于class所描述)的变量在这里.由于React static成员的实用性,本文主要关注React,但一般适用于ES6 class.
语法接近您提出的语法:
class MyClass {
constructor(arg) { if(arg) this.arg = arg; }
static defaultArg = 42;
let arg = MyClass.defaultArg;
}
Run Code Online (Sandbox Code Playgroud)
请注意,您必须添加'es7.classProperties'到此处.babelrc才能进行编译.有关详细信息,请参阅Babel 5.0.0发行说明.
我不知道是否有办法宣布a static为a const.