web-dev-qa-db-fra.com

ES6: comment accéder à un getter statique à partir d'une instance

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

17
Giovanni Bruno

statics 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.

18
T.J. Crowder