@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
, который мы создали. в B's constructor
с Object.create(new.target.prototype)
.
И все это совершенно не заботясь о super
.
Это использует тот факт, что в JS constructor
может возвращать совершенно другой объект, когда клиентский код создает новый экземпляр с new
.
Надеюсь, это поможет кому-то.
01.05.2020
super()
? 28.06.2015super()
в конструкторе? 28.06.2015return Object.create(new.target.prototype, …)
, чтобы избежать вызова суперконструктора. 29.03.2016new.target
? Я никогда не видел, чтобы такая конструкция использовалась раньше 30.03.2017Thanks for the edit - it's right there now; you can do return Object.create(new.target.prototype, …) to avoid calling the super constructor.
Не могли бы вы привести пример, пожалуйста? 01.05.2020