小编典典

ES6 类变量替代方案

all

目前在 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
多个参数用于更大的类时。

我想了很多方法来处理这个问题,但还没有找到任何好的方法。(例如:创建一个ClassConfig处理程序,并传递一个parameter与类分开声明的对象。然后处理程序将附加到类。我也在考虑WeakMaps以某种方式集成。)

你有什么样的想法来处理这种情况?


阅读 135

收藏
2022-03-10

共1个答案

小编典典

2018年更新:

现在有一个第 3 阶段的提案——我期待在几个月内让这个答案过时。

与此同时,任何使用 TypeScript 或 babel 的人都可以使用以下语法:

varName = value

在类声明/表达式主体内,它将定义一个变量。希望在几个月/几周后,我能够发布更新。

更新:Chrome 74 现在可以使用此语法。


ES wiki 中关于 ES6
提案的注释(最大最小类)注释:

(故意)没有直接的声明方式来定义原型数据属性(方法除外)类属性或实例属性

类属性和原型数据属性需要在声明之外创建。

类定义中指定的属性被分配了相同的属性,就好像它们出现在对象字面量中一样。

这意味着 您所要求的内容已被考虑并明确决定反对。

但为什么?

好问题。TC39 的好人希望类声明来声明和定义类的功能。不是它的成员。一个 ES6 类声明为它的用户定义了它的契约。

请记住,类定义定义 原型 方法——在原型上定义变量通常不是您要做的事情。您当然可以使用:

constructor(){
    this.foo = bar
}

在你建议的构造函数中。另见共识摘要

ES7 及更高版本

正在制定 ES7 的新提案,通过类声明和表达式允许更简洁的实例变量 - https://esdiscuss.org/topic/es7-property-
initializers

2022-03-10