0
votes

Comment référencer la classe contenant à partir d'une méthode statique lorsque "Ceci" est déjà pris par l'objet appelant?

Utiliser ES6 / ES2015 et WebPack, j'essaie d'envelopper ma tête autour du petit monstre qui est le mot clé ceci .

J'ai une classe modifier contenant Une méthode statique modification (événement) et dans cette méthode, j'essaie d'apporter un appel récursif à la méthode elle-même (en fonction d'une variable donnée).

Dans la plupart des cas, je pouvais simplement appeler this.change (événement) mais ici le mot clé ceci est déjà occupé par l'objet JQuery qui appelait le Fonction au lieu de la classe contenant.

La solution la plus facile serait de simplement appeler edit.change (événement) à la place, mais il doit y avoir une solution plus propre. Chaque langage de programmation que j'ai rencontré jusqu'à présent a eu une certaine référence à sa classe contenant de la classe intégrée.

Je promets que j'ai vérifié les documents et autres threads sur Stackoverflow, mais personne que j'ai trouvé semble aborder ce problème particulier . xxx

et ici la classe d'édition est défini xxx


6 commentaires

Est-ce votre code actuel? Si oui: vous ne devez pas utiliser class ici. Il suffit de déclarer une fonction normale et l'attribuez à module.exports.changer .


" Chaque langage de programmation que j'ai rencontré jusqu'à présent a eu une certaine référence à sa classe contenant de la classe intégrée. " - Quelles langues de programmation pensez-vous?


@Bergi Peut-être que j'étais trop rapide pour extrapoler, mais mon expérience est avec principalement PHP ("Self"), Python ("Self") et Java ("this"). Je sais aussi Ruby pour avoir le mot-clé "Self".


@Bergi concernant simplement exporter la fonction unique: il existe d'autres fonctions statiques contenues dans la modification. J'ai essayé de travailler avec des cas de classes dans JS, mais j'ai rapidement perdu une trace de laquelle le module utilisait quel objet de modification. J'ai décidé qu'une approche fonctionnelle pseudo-noms est mieux adaptée à mon niveau actuel de compétence concernant JS. Ce code sera définitivement refacturé car ma compréhension augmente.


JavaScript a le ce mot-clé - et c'est assez similaire à celui de Python auto à l'égard que vous pouvez appeler la méthode sur le «mauvais» Soi si vous faites quelque chose de bizarre.


Et oui, il en va de même s'il existe plusieurs fonctions statiques dans la classe . Exporter des fonctions individuelles , à l'aide d'un objet uni (ce qui pourrait être Le module.exports objet ) - mais utilisez uniquement la syntaxe Classe si vous avez des méthodes constructrices et non statiques.


3 Réponses :


0
votes

Les méthodes statiques fonctionnent sur la classe au lieu d'instances de la classe, elles sont appelées sur la classe. Il existe deux façons d'appeler des méthodes statiques: xxx

ou xxx

dans des méthodes statiques, ce mot-clé fait référence à la classe. Vous pouvez appeler une méthode statique d'une autre méthode statique dans la même classe avec ceci.


1 commentaires

Non, cela ne fonctionne pas. Non seulement les champs de classe Syntaxe expérimentale, mais aussi ce se référerait à l'extérieur Ceci (probablement le module) pas la classe .



1
votes

La solution la plus simple serait de simplement appeler edit.change (événement) code> à la place, mais il doit y avoir une solution plus propre p>

Non, c'est bien ce que vous devez utiliser pour toujours faire référence à la classe code> modifier code>. Il n'y a rien de désordre avec ça, il suffit d'l'utiliser. P>

Vous pouvez également utiliser ceci.change (événement) code> si vous n'utilisez pas la méthode comme gestionnaire d'événements. Assurez-vous de l'appeler comme méthode: P>

$('table :input').change(thingsToAddToData, Edit.change.bind(Edit));
// or
$('table :input').change(thingsToAddToData, e => Edit.change(e));


1 commentaires

Merci pour vos conseils! Me donner les autres exemples de la façon dont je "pourrait" résoudre mon problème m'a donné une nouvelle perspective sur la façon de penser d'autres problèmes de mon code.



1
votes

L'une des réponses de @bergi doit fonctionner (en utilisant fonction.pototype.bind ou () => {} ). Cependant, je pense que votre problème est plus structurel. Puisque edit.change est un gestionnaire d'événements qu'il n'a pas de sens de l'appeler directement, car il est censé être tiré à travers des événements.

Je suggérerais de tirer à nouveau la fusion de l'événement avec quelques modifications de paramètres ( http://api.jquerery.com/ déclencheur / ):

remplacer edit.change (événement); avec this.trigger (événement);

De cette façon, il n'est pas nécessaire d'appeler directement le gestionnaire directement, et vous n'avez pas besoin de modifier le contexte , conservant ainsi le code plus transparent.


3 commentaires

Si vous ne voulez pas que l'événement soit tiré deux fois, vous ne voulez pas de gestionnaire d'événements récursif. Vous voulez simplement diviser le comportement de vos manutentionnaires d'événement. Votre gestionnaire d'événements ne doit gérer que la logique des événements, et non le déclencheur de comportement réel de l'événement.


Je n'étais effectivement pas au courant de la distinction entre les gestionnaires d'événements et autres fonctions. Pour moi, une fonction disposée à prendre un objet événementiel était un candidat pour être un gestionnaire d'événements.


Bien que je suis hésitant à utiliser déclencheur () jusqu'à ce que j'ai bien compris le système d'événement et bouillonnez, je vais garder cela sur mon radar pour des situations similaires. Très bon conseil!