@Bergi згадував new.target.prototype
, але я шукав конкретний приклад, який підтверджує, що ви можете отримати доступ this
(або, краще, посилання на об’єкт, з яким створюється клієнтський код new
, див. Нижче), не вимагаючи super()
взагалі дзвонити .
Розмова дешева, покажіть мені код ... Ось ось приклад:
class A { // Parent
constructor() {
this.a = 123;
}
parentMethod() {
console.log("parentMethod()");
}
}
class B extends A { // Child
constructor() {
var obj = Object.create(new.target.prototype)
// You can interact with obj, which is effectively your `this` here, before returning
// it to the caller.
return obj;
}
childMethod(obj) {
console.log('childMethod()');
console.log('this === obj ?', this === obj)
console.log('obj instanceof A ?', obj instanceof A);
console.log('obj instanceof B ?', obj instanceof B);
}
}
b = new B()
b.parentMethod()
b.childMethod(b)
Що виведе:
parentMethod()
childMethod()
this === obj ? true
obj instanceof A ? true
obj instanceof B ? true
Таким чином, ви бачите, що ми ефективно створюємо об'єкт типу B
(дочірнього класу), який також є об'єктом типу A
(його батьківський клас), і всередині childMethod()
дитини B
ми this
вказуємо на об'єкт, obj
який ми створили в Bconstructor
з Object.create(new.target.prototype)
.
І все це без турботи super
взагалі.
Це використовує той факт, що в JS a constructor
може повернути зовсім інший об'єкт, коли код клієнта будує новий екземпляр ізnew
.
Сподіваюся, що це комусь допоможе.