有没有办法从超类方法内部实例化子类的新实例?

时间:2020-10-23 22:37:17

标签: javascript ecmascript-6

我希望能够从超类方法内部实例化子类的新实例。

如果我只有一个没有继承的类,那就很简单:

class A {
    static build(opts) {
        return new A(opts)
    }   
    makeAnother() {
        return A.build(...)
    }
}

const a = new A()
const a2 = a.makeAnother()

这有效。但是,它不适用于子类:

class B extends A { ... }

const b = new B()
const b2 = b.makeAnother() // this returns an instance of A, not B

我想我可以在每个子类中添加build和makeAnother方法,但我不想重复。

2 个答案:

答案 0 :(得分:1)

您可以在超类内部引用this.constructor来获取子类的构造函数(如果方法是在超实例而不是子实例上调用的,则可以是超类本身):

class A {
    static build(theClass) {
        return new theClass()
    }   
    makeAnother() {
        return A.build(this.constructor)
    }
}

const a = new A()
const a2 = a.makeAnother()
console.log(a2 instanceof A);

class B extends A { }

const b = new B()
const b2 = b.makeAnother()
console.log(b2 instanceof B);

答案 1 :(得分:0)

您将要使用

class A {
    static build(opts) {
        return new this(opts)
    }   
    makeAnother() {
        return this.constructor.build(...)
    }
}

除非build做的比这里显示的要多,否则您当然完全不需要它,您宁愿直接在return new this.constructor(...)中使用makeAnother