js调用基类构造函数

时间:2017-06-05 17:33:53

标签: javascript class

是否可以从类中调用基类构造函数?

class BaseCls {
}

class Cls extend BaseCls {
    constructor(options){
        super(options)
    }
}

var instance = new Cls();

现在我想要一个baseclas的实例。像这样:

var baseInstance = new Cls.parent()

我知道我可以调用新的BaseCls(),但是以另一种方式执行它只允许我进行一次导入。

1 个答案:

答案 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);