【问题标题】:this is not allowed before superclass constructor invocation在调用超类构造函数之前不允许这样做
【发布时间】:2019-01-24 13:29:43
【问题描述】:

我想使用 super 的构造函数将子类实例传递给超类,但是我得到了这个错误

super(this);  

在超类构造函数调用之前不允许这样做

为什么我收到了这个错误,还有如何我可以解决这个问题


class Parent
{
    constructor(child)
    {
        this.child = child;
    }

    //...somewhere in code
    //child.doSomething();
}


class Child extends Parent
{
    constructor()
    {
        super(this);   // <==== the error here
    }

    doSomething = () =>
    {
        //...
    }
}

【问题讨论】:

  • 这不是您在 JavaScript(或一般情况下)中实现继承的方式;这更像是作曲。在继承方面,如果doSomething 仅存在于Child,则不应从Parent 调用它(因为并非所有子类都必须拥有它)。在组合方面,Child 不需要 extend Parent,也不应该负责将自身传递给构造函数。
  • 设置this.child = this 没有意义。你的目标是什么?您可以拨打this.doSomething()
  • 或者你想要class Child { constructor() { this.parent = new Parent(this); } … },而不是extends Parent
  • @Ali 您可能想发布一个新问题,在其中发布带有实际问题的实际代码。是的,当您在同一个子实例上调用它们时,this.child 在父和子方法/构造函数中是相同的。您是否来自不同的语言,需要通过“继承”属性的类来区分属性?

标签: javascript ecmascript-6 es6-class


【解决方案1】:

无需将this 传递给super(),因为超类构造函数中的this 将引用同一个对象。回想一下,您的类层次结构将合作对单个新对象执行初始化。

super() 的调用必须在对this 的任何引用之前,包括在super() 参数列表中。为什么?因为为了模仿其他 OO 语言的行为,类层次结构中最顶层的初始化程序必须首先获得新对象。父(或“高级”)初始化程序应该能够假设该级别的原型方法具有基类期望的语义,因为它不“知道”子类可能对其原型做了什么等。如果子类初始化程序可以修改新对象并覆盖基类原型方法(或其他类似的东西),这将是混乱的。

【讨论】:

    【解决方案2】:

    在子的构造方法中,必须先调用父的构造方法才能访问this。超类的构造函数无论如何都可以访问this,因为您正在构造超类的一个实例——尽管它无法访问您的子构造函数可能进行的任何其他初始化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-25
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 2016-03-14
      • 1970-01-01
      相关资源
      最近更新 更多