是否可以从类中调用基类构造函数?
class BaseCls {
}
class Cls extend BaseCls {
constructor(options){
super(options)
}
}
var instance = new Cls();
现在我想要一个baseclas的实例。像这样:
var baseInstance = new Cls.parent()
我知道我可以调用新的BaseCls(),但是以另一种方式执行它只允许我进行一次导入。
答案 0 :(得分:3)
超类是子类*的原型(这就是为什么超类static
方法可以在子类上访问),因此Object.getPrototypeOf
将为您提供超类:
class BaseCls {
constructor() {
console.log("BaseCls");
}
}
class Cls extends BaseCls {
constructor(options){
super(options)
console.log("Cls");
}
}
var base = Object.getPrototypeOf(Cls);
var instance = new base();

您不必将这些语句分开,但如果要将它们合并,则必须将()
置于Object.getPrototypeOf
的调用之外(否则new
尝试消耗它):
var instance = new (Object.getPrototypeOf(Cls))();
当然,如果您想通过引用Cls
的实例来执行此操作,那么它将是:
var superInstance = new (Object.getPrototypeOf(instance.constructor))();
...提供instance
没有自己的constructor
属性。或者更复杂的是:
var superInstance = new (Object.getPrototypeOf(Object.getPrototypeOf(instance).constructor))();
...如果它可能有自己的constructor
属性。
*是的,真的。当您使用B extends A
时,会设置两个并行的继承行:A.prototype
成为B.prototype
,和的原型A
成为B
的原型(而在ES5及更早版本中,函数的原型始终是Function.prototype
)。
假设:
class A {
}
class B extends A {
}
继承看起来像这样:
B −−−−−−−−−−−−−−> A −−−−−−−−−−−−−−> Function.prototype B.prototype −−−−> A.prototype −−−−> Object.prototype
class A {
}
class B extends A {
}
console.log(Object.getPrototypeOf(B) === A);
console.log(Object.getPrototypeOf(A) === Function.prototype);
console.log(Object.getPrototypeOf(B.prototype) === A.prototype);
console.log(Object.getPrototypeOf(A.prototype) === Object.prototype);