【发布时间】:2016-02-21 14:53:23
【问题描述】:
由于 ES6 类只是 JavaScript 现有的基于原型的继承的语法糖[1],因此 (IMO) 提升它的定义是有意义的:
var foo = new Foo(1, 2); //this works
function Foo(x, y) {
this.x = x;
this.y = y;
}
但以下方法不起作用:
var foo = new Foo(1, 2); //ReferenceError
class Foo {
constructor(x, y) {
this.x = x;
this.y = y;
}
}
为什么 ES6 类没有被提升?
【问题讨论】:
-
ES6 类不只是语法糖,尽管它们主要是语法糖。
-
吊装一直是造成误解和混乱的源头。 ES6 中添加的所有新声明结构(
let、const、class)都是未提升的(嗯,它们是半提升的)。除非引用 Eich 或类似的内容,否则您不会得到不是有效推测的答案。 -
@mmm:MDN 是社区编辑的,有时会出错。不像其他网站那样经常,也不像其他网站那样经常,但有时。请参阅this answer 了解它们是如何被吊起和不被吊起的。
-
@PetrPeller:我认为他们认为变量、常量和类是错误的,是的,而且很可能是因为上面提到的 Bergi 等问题。我发现 functions 被提升的事实很有用,但我不知道他们会同意。它发生故障的地方是当您同时拥有被提升(函数 decls)和非提升(向它们或它们的
prototype对象添加属性)的东西时。不过正常的功能,还是蛮好用的。 -
这里的一个含义是你不能把“module.exports = MyClass”放在文件的顶部,然后再声明“class MyClass { ... }”。这行不通。我觉得这很不幸,因为我喜欢将“导出”放在顶部以使 API 易于看到。