目前在 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输入constructor我不想“垃圾”我的构造函数,尤其是当我有 20-30 多个参数用于更大的类时。
this.myVar = true
constructor
我想了很多方法来处理这个问题,但还没有找到任何好的方法。(例如:创建一个ClassConfig处理程序,并传递一个parameter与类分开声明的对象。然后处理程序将附加到类。我也在考虑WeakMaps以某种方式集成。)
ClassConfig
parameter
WeakMaps
你有什么样的想法来处理这种情况?
2018年更新:
现在有一个第 3 阶段的提案——我期待在几个月内让这个答案过时。
与此同时,任何使用 TypeScript 或 babel 的人都可以使用以下语法:
varName = value
在类声明/表达式主体内,它将定义一个变量。希望在几个月/几周后,我能够发布更新。
更新:Chrome 74 现在可以使用此语法。
ES wiki 中关于 ES6 提案的注释(最大最小类)注释:
(故意)没有直接的声明方式来定义原型数据属性(方法除外)类属性或实例属性 类属性和原型数据属性需要在声明之外创建。 类定义中指定的属性被分配了相同的属性,就好像它们出现在对象字面量中一样。
(故意)没有直接的声明方式来定义原型数据属性(方法除外)类属性或实例属性
类属性和原型数据属性需要在声明之外创建。
类定义中指定的属性被分配了相同的属性,就好像它们出现在对象字面量中一样。
这意味着 您所要求的内容已被考虑并明确决定反对。
好问题。TC39 的好人希望类声明来声明和定义类的功能。不是它的成员。一个 ES6 类声明为它的用户定义了它的契约。
请记住,类定义定义 原型 方法——在原型上定义变量通常不是您要做的事情。您当然可以使用:
constructor(){ this.foo = bar }
在你建议的构造函数中。另见共识摘要。
正在制定 ES7 的新提案,通过类声明和表达式允许更简洁的实例变量 - https://esdiscuss.org/topic/es7-property- initializers