目前在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;
}
}
可悲的是,上面的方法行不通,因为类只能包含方法。
我知道我可以在constructor
中this.myvar=true
……但我不想‘垃圾’我的构造函数,特别是当我有20-30+个参数用于一个更大的类时。
我想了很多办法来处理这个问题,但还没有找到好的办法。(例如:创建一个classconfig
处理程序,并传递一个与类分开声明的parameter
对象。然后,处理程序将附加到类。我考虑过weakmaps
也是为了集成。)
你会有什么样的想法来处理这种情况?
只是为了增加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
)都将从那里向上查找。我们可以认为这是生成对象和类属性。
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),但是我对规范的状态尚不清楚: