J'ai une fonction,, a()
que je veux remplacer, mais aussi que l'original a()
soit exécuté dans un ordre dépendant du contexte. Par exemple, parfois, lorsque je génère une page, je souhaite remplacer comme ceci:
function a() {
new_code();
original_a();
}
et parfois comme ceci:
function a() {
original_a();
other_new_code();
}
Comment puis-je obtenir cela original_a()
de la circonscription principale a()
? Est-ce même possible?
S'il vous plaît, ne suggérez pas d'alternatives à la surcharge de cette façon, j'en connais beaucoup. Je pose des questions sur cette façon spécifiquement.
(functi..
et})
. Faire juste}();
produirait le même résultat, car le(function{})()
premier jeu de parenthèses est utilisé parce que vous ne pouvez pas simplement déclarer, anonyme, l'expression de fonction que vous devez l'assigner. Mais en faisant () vous ne définissez rien simplement en retournant une fonction.a
, ne l'appelez pas et stockez la valeur de retour. Les parenthèses me font savoir qu'il se passe autre chose.Le modèle Proxy peut vous aider:
la source
Merci les gars, le modèle de proxy a vraiment aidé ..... En fait, je voulais appeler une fonction globale foo .. Dans certaines pages, j'ai besoin de faire quelques vérifications. J'ai donc fait ce qui suit.
Thnx cela m'a vraiment aidé
la source
org_foo(args)
, appelezorg_foo.call(this, args)
. Cela se maintientthis
comme il l'aurait été lorsque window.foo appelle normalement (sans proxy). Voir cette réponseVous pouvez remplacer une fonction en utilisant une construction comme:
Par exemple:
Edit: Correction d'une faute de frappe.
la source
Passer des arguments arbitraires:
la source
original_a
?La réponse que @Matthew Crumley fournit est d'utiliser les expressions de fonction immédiatement appelées, pour fermer l'ancienne fonction «a» dans le contexte d'exécution de la fonction retournée. Je pense que c'était la meilleure réponse, mais personnellement, je préférerais passer la fonction «a» comme argument à l'IIFE. Je pense que c'est plus compréhensible.
la source
Les exemples ci-dessus ne s'appliquent pas correctement
this
ou ne passent pasarguments
correctement au remplacement de fonction. Underscore _.wrap () encapsule les fonctions existantes, s'appliquethis
et passearguments
correctement. Voir: http://underscorejs.org/#wrapla source
J'avais du code écrit par quelqu'un d'autre et je voulais ajouter une ligne à une fonction que je ne pouvais pas trouver dans le code. Donc, comme solution de contournement, je voulais le remplacer.
Aucune des solutions n'a fonctionné pour moi.
Voici ce qui a fonctionné dans mon cas:
la source
J'ai créé un petit assistant pour un scénario similaire car j'avais souvent besoin de remplacer les fonctions de plusieurs bibliothèques. Cet assistant accepte un «espace de noms» (le conteneur de fonction), le nom de la fonction et la fonction de remplacement. Il remplacera la fonction d'origine dans l'espace de noms référencé par la nouvelle.
La nouvelle fonction accepte la fonction d'origine comme premier argument et les arguments de fonctions d'origine comme le reste. Cela préservera le contexte à chaque fois. Il prend également en charge les fonctions vides et non vides.
Utilisation par exemple avec Bootstrap:
Je n'ai cependant créé aucun test de performance. Cela peut éventuellement ajouter des frais généraux indésirables qui peuvent ou ne peuvent pas être un gros problème, selon les scénarios.
la source
À mon avis, les principales réponses ne sont pas lisibles / maintenables, et les autres réponses ne lient pas correctement le contexte. Voici une solution lisible utilisant la syntaxe ES6 pour résoudre ces deux problèmes.
la source
Ma réponse a donc fini par être une solution qui me permet d'utiliser la variable _this pointant vers l'objet d'origine. Je crée une nouvelle instance d'un "carré" mais je détestais la façon dont le "carré" générait sa taille. J'ai pensé qu'il devrait suivre mes besoins spécifiques. Cependant, pour ce faire, j'avais besoin que le carré ait une fonction "GetSize" mise à jour avec les éléments internes de cette fonction appelant d'autres fonctions déjà existantes dans le carré telles que this.height, this.GetVolume (). Mais pour ce faire, je devais le faire sans aucun piratage fou. Voici donc ma solution.
Une autre fonction d'initialisation ou d'assistance d'objet.
Fonction dans l'autre objet.
la source
Je ne sais pas si cela fonctionnera dans toutes les circonstances, mais dans notre cas, nous essayions de remplacer la
describe
fonction dans Jest afin de pouvoir analyser le nom et ignorer tout ledescribe
bloc s'il répondait à certains critères.Voici ce qui a fonctionné pour nous:
Deux choses qui sont essentielles ici:
Nous n'utilisons pas de fonction fléchée
() =>
.Les fonctions fléchées changent la référence à
this
et nous avons besoin que ce soit le fichierthis
.L'utilisation de
this.describe
etthis.describe.skip
au lieu de justedescribe
etdescribe.skip
.Encore une fois, je ne suis pas sûr que cela ait de la valeur pour quiconque, mais nous avons initialement essayé de nous en sortir avec l' excellente réponse de Matthew Crumley, mais nous devions faire de notre méthode une fonction et accepter les paramètres afin de les analyser au conditionnel.
la source