ES6 类变量替代方案

2022-08-29 23:02:08

目前在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;
    }
}

可悲的是,上述方法不起作用,因为类只能包含方法。

我知道我可以在...但我不想“垃圾”我的构造函数,特别是当我有20-30多个参数用于更大的类时。this.myVar = trueconstructor

我正在考虑许多方法来解决这个问题,但还没有找到任何好的方法。(例如:创建一个处理程序,并传递一个对象,该对象与类分开声明。然后,处理程序将附加到该类。我正在考虑以某种方式进行整合。ClassConfigparameterWeakMaps

对于这种情况,您有什么样的想法?


答案 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


答案 2

只是为了补充本杰明的答案 - 类变量是可能的,但你不会用来设置它们。prototype

对于真正的类变量,您需要执行以下操作:

class MyClass {}
MyClass.foo = 'bar';

从类方法中,变量可以作为 (or ) 进行访问。this.constructor.fooMyClass.foo

通常无法从类实例访问这些类属性。即 给 但MyClass.foo'bar'new MyClass().fooundefined

如果您还希望从实例访问类变量,则必须另外定义一个 getter:

class MyClass {
    get foo() {
        return this.constructor.foo;
    }
}

MyClass.foo = 'bar';

我只用Traceur测试过它,但我相信它在标准实现中也会同样有效。

JavaScript实际上没有类。即使在ES6中,我们也在研究基于对象或原型的语言,而不是基于类的语言。在任何中,X.prototype.构造函数指向 。当在 上使用 new 运算符时,将创建一个继承 的新对象。该新对象(包括 )中的任何未定义属性都将从那里查找。我们可以将其视为生成对象和类属性。function X () {}XXX.prototypeconstructor