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 draft,ClassElement 的唯一产品是静态方法和实例方法以及分号本身。好的,可以使用一对 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 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 release notes。
我不知道是否有办法将 static
声明为 const
。
虽然它不是 ES6 规范的一部分,但这看起来很快就会出现,并且已经得到 Babel 和其他一些人的支持。
规格如下:
https://github.com/jeffmo/es-class-fields-and-static-properties
以及所有提案及其状态的完整列表:
https://github.com/tc39/ecma262
有什么方法可以使用 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 draft,ClassElement 的唯一产品是静态方法和实例方法以及分号本身。好的,可以使用一对 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 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 release notes。
我不知道是否有办法将 static
声明为 const
。
虽然它不是 ES6 规范的一部分,但这看起来很快就会出现,并且已经得到 Babel 和其他一些人的支持。
规格如下: https://github.com/jeffmo/es-class-fields-and-static-properties
以及所有提案及其状态的完整列表: https://github.com/tc39/ecma262