@Bergi mencionou new.target.prototype
, mas eu estava procurando um exemplo concreto provando que você pode acessar this
(ou melhor, a referência ao objeto com o qual o código do cliente está criando new
, veja abaixo) sem ter que chamar super()
.
Falar é barato, mostre-me o código ... Então, aqui está um exemplo:
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)
O que resultará em:
parentMethod()
childMethod()
this === obj ? true
obj instanceof A ? true
obj instanceof B ? true
Assim você pode ver que estamos efetivamente criando um objeto do tipo B
(a classe filha), que também é um objeto do tipo A
(sua classe pai) e no childMethod()
da criança B
, temos this
apontando para o objeto obj
que criamos no B de constructor
com Object.create(new.target.prototype)
.
E tudo isso sem se preocupar com super
nada.
Isso aproveita o fato de que em JS a constructor
pode retornar um objeto completamente diferente quando o código do cliente constrói uma nova instância com new
.
Espero que isso ajude alguém.