Можно ли вызвать конструктор базового класса из класса?
class BaseCls {
}
class Cls extend BaseCls {
constructor(options){
super(options)
}
}
var instance = new Cls();
Теперь я хочу экземпляр baseclas. Что-то вроде этого:
var baseInstance = new Cls.parent()
Я знаю, что я могу просто вызвать новый BaseCls(), но при этом другой способ позволяет мне иметь только один импорт.
Суперкласс является прототипом подкласса * (вот почему 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);