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

时间:2018-08-17 13:29:27

标签: javascript ecmascript-6 es6-class

我想使用super的构造函数将子类实例传递给超类,但出现此错误

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

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


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

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

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

为什么,我也收到此错误,还如何我可以解决此问题


os.walk

2 个答案:

答案 0 :(得分:3)

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

super()的调用必须先于对this的引用,包括在super()参数列表中。为什么?因为为了模仿其他OO语言的行为,必须这样一种情况:类层次结构中最顶层的初始化程序首先要使用新对象。父(或“高级”)初始化器应能够假定该级别的原型方法具有基类期望的语义,因为它不“知道”子类可能对其原型进行了什么处理等。可以修改新对象并覆盖基类原型方法(或其他类似方法),否则会很混乱。

答案 1 :(得分:2)

在子级的构造函数方法中,必须在访问this之前调用父级的构造函数。由于您正在构造超类的实例,因此无论如何,超类的构造函数将可以访问this,尽管它无法访问子构造函数可能进行的任何其他初始化。