Il y a beaucoup de questions similaires à propos d'appeler des fonctions par nom de manière dynamique. Cependant, je ne trouve pas de solution à mon problème spécifique dans lequel j'ai des fonctions locales dans une fermeture sans exposer les fonctions à l'interface publique de mon objet.
permet de voir du code (il s'agit d'un exemple de fiction) ... P>
obj.privateMethod1 = function(arg) { //do something with arg }; obj.privateMethod2 = function(arg) { //do something else with arg };
5 Réponses :
Vous ne pouvez pas faire référence à une variable locale par une chaîne. Vous devez ajouter les objets locaux à un espace de noms:
(function(window,$) { // Use "var MyObject = " instead of "MyObject = "!! Otherwise, you're assigning // the object to the closest parent declaration of MyVar, instead of locally! var MyObject = (function($) { var obj = {}; var local = {}; // <-- Local namespace obj.publicMethod = function(number,otherarg) { local['privateMethod'+number].call(this, otherarg); }; var privateMethod1 = local.privateMethod1 = function(arg) { //do something with arg }; var privateMethod2 = local.privateMethod2 = function(arg) { //do something else with arg }; return obj; })($); window.MyObject = MyObject; })(window,jQuery);
Et de clarifier, vous n'avez plus besoin des déclarations d'alias var privateMethodx code> car ils font partie de
local code>; Je suppose qu'ils sont toujours dans cet exemple de comparaison.
Les fonctions privées sont des variables locales et ne font pas partie d'un objet. Donc, la notation à la place, vous pouvez faire deux objets: [...] code> pour accéder à une propriété ne fonctionnera jamais car il n'y a pas d'objet Les fonctions privées sont des propriétés de.
privé code> et
public code>: p>
Si simple droit ... je chantais le mantra au point où j'ai oublié ce que cela voulait dire.
Le fait que vous ne puissiez pas appeler ces fonctions de l'extérieur de la portée dans laquelle ils sont définis sont une partie fondamentale de JavaScript, et bien toutes les langues de programmation.
Le seul moyen d'appeler ces fonctions est de les rendre publics . Une approche basée sur la convention peut être appliquée à la place. Le préfixe de soulignement est assez omniprésent et compris généralement signifie "non destiné à être appelé comme une fonction publique", par exemple: p>
Je suis surpris que la réponse incorrecte soit marquée comme acceptée. En fait, vous pouvez faire référence à une variable locale par une chaîne. Tout simplement en utilisant Ce code est très mauvais et dans 99,9% de cas, vous ne devez pas utiliser eval code>:
eval code>. Mais vous devez savoir comment cela fonctionne et ce que vous pouvez faire avec cela. J'ai moi-même eu quelques cas très spécifiques lorsque l'utilisation de
eval code> était nécessaire. P> p>
Ce Q est vieux mais, qu'est-ce qui ne va pas avec la réponse acceptée? Il est largement accepté comme une approche correcte des méthodes publiques / privées sur les objets JavaScript.
En fait, ma plainte était contre "Vous ne pouvez pas faire référence à une variable locale d'une chaîne". Ce n'est pas vrai, tu peux. Comme je l'ai écrit: en utilisant eval code> est une très mauvaise pratique, mais vous devez savoir comment l'utiliser. Avec
eval code> Vous pouvez accéder à la variable locale par une chaîne. Je pense que cette réponse peut tromper un autre utilisateur javascript. Qu'en est-il d'une autre partie de la réponse - c'est correct (bien que je pense que la variante @PIMVDB était un peu meilleure, mais cela ne pas me tromper).
En supposant que vous n'ayez que quelques fonctions à appeler, vous pouvez créer votre propre version de la fenêtre à utiliser pour appeler les fonctions: puis dans votre code: p> < Pré> xxx pré> Assurez-vous simplement que les fonctions sont définies lorsque vous les ajoutez à l'objet. Dans un module où les fonctions n'existent pas au moment de la charge, vous pouvez les ajouter lorsque le module est initialisé: p>