繁体   English   中英

如何在构造函数外部调用超级构造函数?

[英]How do I call a super constructor outside a constructor?

现在,JavaScript具有类,我想知道如何在类构造函数之外调用超级构造函数。

我不成功的幼稚尝试(导致SyntaxError):

class A
{
    constructor() { this.a = 1; }
}

function initB()
{
    super(); // How to invoke new A() on this here?
    this.b = 2;
}

class B extends A
{
    constructor() { initB.call(this); }
}

我知道在Java之类的其他语言中,只能在派生类的构造函数内部调用超级构造函数,但是ES6类是用于基于原型的继承的语法糖,因此如果使用此方法不可行,我会感到惊讶内置语言功能。 我只是似乎不知道正确的语法。

到目前为止,我所拥有的最好的感觉就像是在作弊:

class A
{
    constructor() { this.a = 1; }
}

function initB()
{
    let newThis = new A();
    newThis.b = 2;
    return newThis;
}

class B extends A
{
    constructor() { return initB(); }
}

extends某些内容的类的每个构造函数都必须包含一个直接的super(…)调用。
直接的super(…)调用只能放在构造函数中。 真的没有办法解决这个问题。

实际上,您不应将类的初始化逻辑放在其构造函数之外的任何地方。 直接而正确的解决方案是根本不使用initB

class A {
    constructor() { this.a = 1; }
}

class B extends A {
    constructor() {
        super();
        this.b = 2;
    }
}

也就是说,有一种方法可以颠覆“ super()调用必须在构造函数中”的要求。 将其放入箭头函数也很重要! 所以你可以做

class A {
    constructor() { this.a = 1; }
}

function initB(_super) {
    var b = _super();
    b.b = 2;
}
class B extends A {
    constructor() {
        initB(() => super());
    }
}

请保证我永远不要这样做。

另一种模式是根本不调用super() ,只要您从构造函数中返回一个对象,该方法就起作用。 这样,您可以将对象的实际构造放在其他任何地方:

class A {
    constructor() { this.a = 1; }
}

function makeB() {
    var b = Reflect.construct(A, [], B); // call the A constructor with B for the prototype
    b.b = 2;
    return b;
}
class B extends A {
    constructor() {
        return makeB();
    }
}

真的不是更好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM