【问题标题】:Is there a way to turn off the "this is not allowed before super" rule in babelify?有没有办法在 babelify 中关闭“在超级之前不允许这样做”规则?
【发布时间】:2016-03-14 08:41:07
【问题描述】:

我正在使用 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 |   constructor() {
> 22 |     this.name = 'John';
     |     ^
  23 |   }
  24 | }
  25 | 

在我看来,这不应该被触发,因为我根本没有在构造函数中进行任何 super 调用,因此没有冲突的风险。我已经在 Github 上提交了一个问题,但我想知道是否有办法同时关闭它。

【问题讨论】:

    标签: javascript gulp ecmascript-6 babeljs


    【解决方案1】:

    这不是错误。子类必须在尝试访问this之前显式调用this

    class Two extends One {
        constructor(...args) {
            super(...args);
            this.name = 'John';
        }
    }
    

    这是在 ECMAScript 标准中定义的(参见 this 答案),Babel 紧随其后。

    【讨论】:

    • 看到这个答案后,我做了更多的阅读,看来您可能是正确的。如果是这样,那让我非常难过。如果您根本不引用super,那么通过引用this 可以引起任何问题。我读过一篇文章说没有调用super,JavaScript 不知道this 是什么。老实说,如果这是真的,那就是糟糕的设计。我认为我们中的很多人都可以很容易地编写一个不需要super 调用子类构造函数的系统。
    • @rescuecreative: “如果你根本不引用 super 的话,引用 this 不会引起任何问题。” 有。强制执行的原因是,如果该类扩展了一个内置类,例如ArrayErrorthis 大部分在对其进行任何访问之前都会正确初始化。
    • @FelixKling 我花了很长时间思考如何证明你错了,但我做不到。你是对的。公平地说,我认为您不一定必须将构造函数与对象的基本性质紧密结合,例如它是有序集合还是无序集合。有些东西可以通过扩展来隐式派生,可能消除了进行super 调用的需要。但我需要比现在更多的时间来试验它:)
    【解决方案2】:

    不,没有办法“关闭”,因为这是 ECMAScript 2015 标准中定义的要求。

    this 在扩展类的构造函数中调用 super(...) 之前不可用。

    this answer 中可以看到标准中定义的确切细节。

    【讨论】:

      【解决方案3】:

      这不是 Babel 的事情,它是在 ES2015 中定义的。您无法将其关闭。

      在派生构造函数中,this 在调用 super 之前是未定义的。与(比如说)Java 不同,对 super 的调用绝不是隐式的,您必须明确地编写它们。

      这主要在§9.2.2[[Construct]] ( argumentsList, newTarget)§12.3.5.1 中定义,super 的运行时语义:[[Construct]] 仅在 [[ConstructorKind]] 是“base”(而不是“派生”)时调用 OrdinaryCallBindThis ”)。否则,this 保持未定义,直到您调用 super,其中一部分在超级构造函数上调用 [[Construct]],该构造函数要么调用自己的 super(如果它也是派生构造函数)或 OrdinaryCallBindThis(如果它是一个基础构造函数)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-24
        • 1970-01-01
        • 2010-12-03
        • 2016-03-22
        • 2021-11-27
        • 1970-01-01
        • 2019-06-17
        相关资源
        最近更新 更多