簡體   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