JS вызвать конструктор базового класса

1

Можно ли вызвать конструктор базового класса из класса?

class BaseCls {
}

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

var instance = new Cls();

Теперь я хочу экземпляр baseclas. Что-то вроде этого:

var baseInstance = new Cls.parent()

Я знаю, что я могу просто вызвать новый BaseCls(), но при этом другой способ позволяет мне иметь только один импорт.

Теги:
class

1 ответ

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню