目前,在 ES5 中,我们许多人在框架中使用以下模式来创建类和类变量,这很舒服:
// ES 5
FrameWork.Class({
variable: 'string',
variable2: true,
init: function(){
},
addItem: function(){
}
});
在 ES6 中,您可以本地创建类,但没有选项可以拥有类变量:
// ES6
class MyClass {
const MY_CONST = 'string'; // <-- this is not possible in ES6
constructor(){
this.MY_CONST;
}
}
遗憾的是,上面的方法不起作用,因为类只能包含方法。
我明白我可以this.myVar = true
in constructor
…但我不想“垃圾”我的构造函数,尤其是当我有 20-30 个以上的参数用于更大的类时。
我想了很多方法来解决这个问题,但还没有找到好的方法。 (例如:创建一个ClassConfig
处理程序,并传递一个parameter
对象,与类分开声明。然后处理程序将附加到该类。我在想WeakMaps
也以某种方式整合。)
你会有什么样的想法来处理这种情况?
2018年更新:
现在有一个第三阶段的提案 - 我期待着在几个月内使这个答案过时。
与此同时,任何使用 TypeScript 或 babel 的人都可以使用以下语法:
varName = value
在类声明/表达式体内,它将定义一个变量。希望在几个月/几周内我能够发布更新。
更新:Chrome 74 现在附带此语法。
ES wiki 中关于 ES6 提案的注释(最大最小类 http://wiki.ecmascript.org/doku.php?id=strawman:maximally_minimal_classes) note:
(有意)没有直接的声明方式来定义原型数据属性(方法除外)类属性或实例属性
类属性和原型数据属性需要在声明之外创建。
类定义中指定的属性被分配与对象字面量中出现的属性相同的属性。
这意味着您所要求的内容已被考虑,并明确决定反对。
但为什么?
好问题。 TC39 的好心人希望通过类声明来声明和定义类的功能。不是它的成员。 ES6 类声明为其用户定义了其契约。
请记住,类定义定义了原型方法 - 在原型上定义变量通常不是您要做的事情。
当然,您可以使用:
constructor(){
this.foo = bar
}
在构造函数中,就像你建议的那样。另请参阅.
ES7 及更高版本
ES7 的一项新提案正在制定中,该提案允许通过类声明和表达式更简洁的实例变量 -https://esdiscuss.org/topic/es7-property-initializers https://esdiscuss.org/topic/es7-property-initializers
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)