当前位置: 首页 > 知识库问答 >
问题:

ES6类变量备选项

充栋
2023-03-14

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

可悲的是,上面的方法行不通,因为类只能包含方法。

我知道我可以在constructorthis.myvar=true……但我不想‘垃圾’我的构造函数,特别是当我有20-30+个参数用于一个更大的类时。

我想了很多办法来处理这个问题,但还没有找到好的办法。(例如:创建一个classconfig处理程序,并传递一个与类分开声明的parameter对象。然后,处理程序将附加到类。我考虑过weakmaps也是为了集成。)

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

共有2个答案

阎卓
2023-03-14

只是为了增加Benjamin的答案-类变量是可能的,但是您不会使用prototype来设置它们。

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

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

在类方法中,可以以this.constructor.foo(或myclass.foo)的形式访问该变量。

这些类属性通常不能从类实例访问。即MyClass.foo给出“bar”新的MyClass()。foo未定义的

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

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

MyClass.foo = 'bar';

我只用Traceur测试了这一点,但我相信它在标准实现中也会工作。

JavaScript并没有真正的类。即使在ES6中,我们看到的是一种基于对象或原型的语言,而不是一种基于类的语言。在任何函数X(){}中,X.prototype.constructor都指向X。在x上使用new运算符时,将创建一个继承x.prototype的新对象。新对象中任何未定义的属性(包括constructor)都将从那里向上查找。我们可以认为这是生成对象和类属性。

余阳秋
2023-03-14

2018年更新:

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

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

varName = value

它将定义一个变量。希望在几个月/几周后,我能发布一个更新。

更新:Chrome74现在提供这种语法。

ES6(最大最小类)中提案的ESWiki注释:

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

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

为类定义中指定的属性分配的属性与在对象文本中出现的属性相同。

这意味着你所要求的已经被考虑过了,并且明确地决定反对。

好问题。TC39的优秀人员希望类声明来声明和定义类的能力。而不是其成员。ES6类声明为其用户定义其契约。

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

constructor(){
    this.foo = bar
}

就像你建议的那样。另见协商一致意见摘要。

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

 类似资料:
  • 问题内容: 当前在ES5中,我们许多人在框架中使用以下模式来创建类和类变量,这很方便: 在ES6中,您可以本机创建类,但是没有选择可以使用类变量: 可悲的是,上述方法不起作用,因为类只能包含方法。 我知道我可以在…但我不想“垃圾”我的构造,特别是当我有一个更大的类20-30 +参数。 我在考虑解决该问题的多种方法,但尚未找到任何好的方法。(例如:创建一个处理程序,并传递一个与类分开声明的对象。然后

  • 主要内容:1.变量初始化,2.变量声明的有效语法类型,JavaScript变量范围,JavaScript初始化不吊装变量是内存中的命名空间,用于存储值。 变量的名称也称为标识符。 命名变量(标识符)时应牢记一些规则。 这些规则如下: 它可以包含数字和字母。 不能以数字开头变量的名称。 关键字不能用作变量的名称。 除美元()符号和下划线()外,标识符不包含空格和特殊字符。 1.变量初始化 变量初始化是将值存储在变量中的过程,可以在使用变量之前随时对其进行初始化。 ES6语法使用关键字声明变量。 在

  • 问题内容: 三年来,我一直在使用一些JavaScript小片段,但是现在我正在构建一个React应用程序,并且正在研究它。有一件我不了解的基本事情。React使用Dispatcher and Stores构建其Flux模式,我不明白的是,该Dispatcher在所有应用程序中都是可见的,因为Actions使用分派器来分派动作,而Stores向Dispatcher注册以获取通知(因此并非每次都是新的

  • ES5中的函数本质上是可以在外面“看到”,但不能进入的容器。 在ES6中,var仍然以这种方式工作,使用函数作为容器,但有两种新的方法来声明变量:和let。 const和let使用{和}块作为容器,故称为“块作用域”。 块作用域在循环期间非常有用。 考虑以下代码: var i; for (i = 0; i < 10; i += 1) { var j = i; let k = i; } co

  • 问题 你想创建类变量和实例变量(属性)。 解决方案 类变量 class Zoo @MAX_ANIMALS: 50 MAX_ZOOKEEPERS: 3 helpfulInfo: => "Zoos may contain a maximum of #{@constructor.MAX_ANIMALS} animals and #{@MAX_ZOOKEEPERS} zoo keep

  • 问题内容: 使用ES6导入时,是否可以将某些内容导入提供变量名称的模块中? 即我想根据配置中提供的值在运行时导入一些模块: 问题答案: 不与声明。并以可静态分析的方式进行定义,因此它们不能依赖于运行时信息。 您正在寻找loader API(polyfill),但是我对规范的状态尚不清楚: