javascript - ES6 类变量替代方案

标签 javascript class ecmascript-6

目前,在 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…但我不想“垃圾”我的构造函数,尤其是当我有 20-30 个构造函数时+ 更大类的参数。

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

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

最佳答案

2018年更新:

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

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

varName = value

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

更新:Chrome 74 现在附带此语法。

<小时/>

ES wiki 中关于 ES6 提案的注释 ( maximally minimal classes ) 注意:

There is (intentionally) no direct declarative way to define either prototype data properties (other than methods) class properties, or instance property

Class properties and prototype data properties need be created outside the declaration.

Properties specified in a class definition are assigned the same attributes as if they appeared in an object literal.

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

但是...为什么?

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

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

constructor(){
    this.foo = bar
}

按照您的建议在构造函数中。另请参阅the summary of the consensus .

ES7 及更高版本

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

关于javascript - ES6 类变量替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36428409/

相关文章:

javascript - Angular 2 将组件向后移动(更改 z 位置)

javascript - 悬停在 highchart 中的同步图表上时线条淡出

python - 多线程类(python)

c++ - 有没有一种简单的方法来判断一个类/结构是否没有数据成员?

javascript - 如何访问 es6 类构造函数中单击事件的方法?

javascript - Node.js 计划支持导入/导出 ES6 (ECMAScript 2015) 模块

javascript - 为什么我无法访问在 ngOnInit 上设置的对象

php - 验证 .edu 或 .ac 电子邮件地址

C# 从类中获取值到 mainForm

javascript - 有什么方法可以根据外部值来依赖对象中键的存在吗?