Comment puis-je accéder à un getter statique à partir d'une instance de la classe qui implémente ce getter?
par exemple, j'ai cette classe:
class Component {
static get isComponent() { return true; }
constructor() {}
}
const c = new Component();
comment puis-je appeler à partir de "c" "isComponent" de la classe "Component"? J'ai lu et tout ce que j'ai trouvé est quelque chose comme ça:
Object.getPrototypeOf(c).isComponent
mais cela ne fonctionne pas sur mon cas car il n'y a pas de méthode "isComponent" dans l'objet prototype Component. Le code ci-dessus fonctionne si j'écris la classe comme ceci:
Component.prototype.isComponent = () => { return true; }
mais ce n'est pas ainsi que j'aimerais écrire des cours. Qu'est-ce que je rate? tnx
static
s deviennent les propriétés de la fonction constructeur, auxquelles vous pouvez accéder sur une instance via la propriété constructor
:
console.log(c.constructor.isComponent);
class Component {
static get isComponent() { return true; }
constructor() {}
}
const c = new Component();
console.log(c.constructor.isComponent); // true
Bien sûr, cela repose sur le fait que constructor
n'a pas été détruit. :-) Avant la syntaxe class
, vous verriez des gens oublier de définir constructor
correctement dans les hiérarchies d'héritage tout le temps. Heureusement, avec la syntaxe class
, il est géré automatiquement afin que les personnes qui oublient ne soient plus un problème.
Bien sûr, l'instance peut avoir une propriété "propre" constructor
, en l'observant sur le prototype. Donc, si cela vous inquiète, vous pouvez passer au prototype:
console.log(Object.getPrototypeOf(c).constructor.isComponent);
class Component {
static get isComponent() { return true; }
constructor() {}
}
const c = new Component();
console.log(Object.getPrototypeOf(c).constructor.isComponent); // true
Bien sûr, si vous savez de quel constructeur il s'agit, vous pouvez aller directement à la source:
console.log(Component.isComponent);
class Component {
static get isComponent() { return true; }
constructor() {}
}
// const c = new Component(); <== Don't need it
console.log(Component.isComponent); // true
... mais bien sûr, seulement si vous savez à l'avance que Component
est le constructeur que vous voulez.