Javascript 有没有办法关闭“关闭”按钮;在“超级”之前,这是不允许的;在巴别利菲统治?
我正在使用Gulp运行babelify 7.2.0,在以下代码中出现错误:Javascript 有没有办法关闭“关闭”按钮;在“超级”之前,这是不允许的;在巴别利菲统治?,javascript,gulp,ecmascript-6,babeljs,Javascript,Gulp,Ecmascript 6,Babeljs,我正在使用Gulp运行babelify 7.2.0,在以下代码中出现错误: class One {} class Two extends One { constructor() { this.name = 'John'; } } 以下是错误的症结: SyntaxError: [the file path in question]: 'this' is not allowed before super() 20 | class Two extends One { 21
class One {}
class Two extends One {
constructor() {
this.name = 'John';
}
}
以下是错误的症结:
SyntaxError: [the file path in question]: 'this' is not allowed before super()
20 | class Two extends One {
21 | constructor() {
> 22 | this.name = 'John';
| ^
23 | }
24 | }
25 |
在我看来,这不应该触发,因为我根本没有在构造函数中进行任何
super
调用,所以没有冲突的风险。我已经在Github上提交了一个问题,但我想知道是否有办法同时关闭它。这不是一个bug。子类必须在尝试访问此之前显式调用super
:
class Two extends One {
constructor(...args) {
super(...args);
this.name = 'John';
}
}
这是ECMAScript标准中定义的(见答案),巴贝尔紧随其后。不,无法“关闭”,因为这是ECMAScript 2015标准中定义的要求
在扩展类的构造函数中调用super(…)
之前,此
不可用
关于在标准中定义的确切细节,请参见。这不是巴别塔,而是在ES2015中定义的。你不能把它关掉
在派生构造函数中,此
在调用super
之前未定义。与(比如)Java不同,对super
的调用从来都不是隐式的,您必须显式地编写它们
这主要是在,[[Construct]](argumentsList,newTarget)
中定义的,超级的运行时语义:[[Construct]]
仅在[[ConstructorKind]]
为“基”(而非“派生”)时调用。否则,此
将保持未定义状态,直到您调用,其中一部分调用超级构造函数上的[[Construct]]
,超级构造函数调用自己的超级
(如果它也是派生构造函数)或OrdinaryCallBindThis
(如果它是基本构造函数).看到这个答案后,我又读了一些书,看来你可能是对的。如果是这样的话,我会很难过。如果您根本不引用super
,那么通过引用this
就不会产生任何问题。我读到一篇文章说,没有调用super
,JavaScript不知道这是什么。老实说,如果这是真的,那就是糟糕的设计。我认为我们中的很多人都可以很容易地编写一个不需要对子类构造函数进行super
调用的系统@rescuecreative:“如果你根本不引用super,那么引用它就不会引起任何问题。”。之所以强制这样做,是因为如果该类扩展了一个内置类,例如数组
或错误
,这个
在访问它之前必须正确初始化。@FelixKling我花了很长时间仔细思考如何证明你错了,但我不能。你说得对。公平地说,我认为您不必将构造函数与对象的基本性质紧密结合,例如,它是有序集合还是无序集合。有些东西可以通过扩展隐式派生,这样就不需要进行super
调用。但这将需要我比现在更多的时间来试验:)