我希望能够从超类方法内部实例化子类的新实例。
如果我只有一个没有继承的类,那就很简单:
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方法,但我不想重复。
答案 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
。