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

Javascript 在调用超类构造函数之前不允许这样做,javascript,ecmascript-6,es6-class,Javascript,Ecmascript 6,Es6 Class,我想使用super的构造函数将子类实例传递给super类,但我遇到了这个错误 super(this); 在调用超类构造函数之前不允许这样做 为什么我会出现此错误,以及如何解决此问题 类父类 { 构造函数(子级) { 这个孩子=孩子; } //…在代码中的某个地方 //儿童。doSomething(); } 类子级扩展父级 { 构造函数() { 超级(这个);// { //... } } 无需将此传递给super(),因为超类构造函数中的此将是对同一对象的引用。请记住,您的类层次结构将协作

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

super(this);  
在调用超类构造函数之前不允许这样做

为什么我会出现此错误,以及如何解决此问题


类父类
{
构造函数(子级)
{
这个孩子=孩子;
}
//…在代码中的某个地方
//儿童。doSomething();
}
类子级扩展父级
{
构造函数()
{
超级(这个);//
{
//...
}
}

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


调用
super()
必须在引用
this
之前,包括在
super()
参数列表中。为什么?因为为了模仿其他OO语言的行为,必须是类层次结构中最顶层的初始值设定项首先得到新对象。父对象(或“高级”)初始值设定项应该能够假设该级别的原型方法具有基类所期望的语义,因为它不“知道”子类可能对其原型做了什么。如果子类初始值设定项可以修改新对象并重写基类原型方法(或其他类似的方法)在子类的构造函数方法中,必须在访问
之前调用父类的构造函数。无论如何,超类的构造函数都可以访问
,因为您正在构造超类的实例-尽管它不能访问子类构造的任何其他初始化ctor可能会这样做。

这不是在JavaScript中实现继承的方式(或一般情况下);这更像是组合。在继承方面,如果
doSomething
仅存在于
子类上,则不应该从
父类调用它(因为并非所有子类都需要它).在组合术语中,
子项
不需要扩展父项
,也不应该负责将自己传递给构造函数。设置
this.Child=this
没有意义。你的目标是什么?你可以调用
this.doSomething()
或者你想要
类子项{constructor()){this.parent=新父级(this);}…}
,而不是
扩展父类
?@Ali您可能想在发布实际代码和实际问题的地方发布一个新问题。是的,
当您在同一个子实例上调用父类和子类方法/构造函数时,该子类
在父类和子类方法/构造函数中都是相同的。您来自不同的语言,需要进行差异化吗uish属性由您“继承”它们的类决定?@Ali您可以拥有,但您
class Parent
{
    constructor(child)
    {
        this.child = child;
    }

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


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

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