@Bergi mencionó new.target.prototype
, pero estaba buscando un ejemplo concreto que demuestre que puede acceder this
(o mejor, la referencia al objeto con el que está creando el código del cliente new
, ver más abajo) sin tener que llamar super()
en absoluto.
Hablar es barato, enséñame el código ... Así que aquí tienes un ejemplo:
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)
Que dará como resultado:
parentMethod()
childMethod()
this === obj ? true
obj instanceof A ? true
obj instanceof B ? true
Entonces, puede ver que estamos creando efectivamente un objeto de tipo B
(la clase secundaria) que también es un objeto de tipo A
(su clase principal) y dentro childMethod()
del elemento secundario B
tenemos this
apuntando al objeto obj
que creamos en B constructor
con Object.create(new.target.prototype)
.
Y todo esto sin importarle super
nada.
Esto aprovecha el hecho de que en JS a constructor
puede devolver un objeto completamente diferente cuando el código del cliente construye una nueva instancia con new
.
Espero que esto ayude a alguien.