Не уверен, что это именно то, что вы хотите, но это работает для вашего примера:
class A {
constructor() {
this.A = 'A';
}
}
class B extends A {
constructor() {
super();
this.B = 'B';
}
}
var base = new A();
var derived = new B();
base.A = 'C';
// Create a B instance from A so that
// a new A isn't instantiated and
// fromInstance.A === 'C'
var fromInstance = new B();
Object.assign(fromInstance, base);
console.log(fromInstance);
Вот альтернативное решение.На самом деле это довольно часто встречается в C # и Java, но поскольку в JS нет перегрузки методов, это довольно громоздко и не так приятно по сравнению с приведенным выше решением:
class A {
constructor(source) {
if(source){
//use properties/stuff from source
this.A=source.A;
}
else{
//only perform initialization if source is not provided
this.A = 'A';
}
}
}
class B extends A {
constructor(source) {
super(source);
this.B = 'B';
}
}
var base = new A();
var derived = new B();
base.A = 'C';
// Create a B instance from A so that
// a new A isn't instantiated and
// fromInstance.A === 'C'
var fromInstance = new B(base);
console.log(fromInstance);
По сути, существует две версииконструктор, который создает совершенно новый объект, и тот, который в значительной степени копирует старый объект.
Я думаю, что есть некоторое недопонимание, каждый экземпляр B
по определению является экземпляром A
, неважно, что ты делаешь.Если вы хотите, чтобы вызывался super
, вы вызываете конструктор A
и, таким образом, создаете экземпляр A
.