@Bergi l'a mentionné new.target.prototype
, mais je cherchais un exemple concret prouvant que vous pouvez accéder this
(ou mieux, la référence à l'objet avec lequel le code client crée new
, voir ci-dessous) sans avoir à appeler super()
du tout.
Parler c'est pas cher, montrez-moi le code ... Voici donc un exemple:
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)
Qui produira:
parentMethod()
childMethod()
this === obj ? true
obj instanceof A ? true
obj instanceof B ? true
Ainsi, vous pouvez voir que nous créons effectivement un objet de type B
(la classe enfant) qui est également un objet de type A
(sa classe parent) et dans le childMethod()
of child B
nous avons this
pointé vers l'objet obj
que nous avons créé dans B's constructor
avecObject.create(new.target.prototype)
.
Et tout cela sans se soucier super
du tout.
Cela tire parti du fait que dans JS, a constructor
peut renvoyer un objet complètement différent lorsque le code client construit une nouvelle instance avecnew
.
J'espère que cela aide quelqu'un.