Nous avons une application cliente épaisse utilisant fortement jQuery et souhaitant profiler les performances du code à l'aide de l'API console.profile de firebug. Le problème est, je ne veux pas changer le code pour écrire les instructions de profil. Prenez cet exemple:Ajouter des instructions console.profile au code JavaScript/jQuery à la volée
var search=function(){ this.init=function(){ console.log('init'); } this.ajax=function(){ console.log('ajax'); //make ajax call using $.ajax and do some DOM manipulations here.. } this.cache=function(){ console.log('cache'); } } var instance=new search(); instance.ajax();
Je veux profil ma méthode de instance.ajax, mais je ne veux pas ajouter des instructions profil dans le code, car cela rend difficile de maintenir le code.
Je suis en train de remplacer les méthodes utilisant des fermetures, comme ceci: http://www.novogeek.com/post/2010/02/27/Overriding-jQueryJavaScript-functions-using-closures.aspx mais je ne suis pas très sûr de la façon dont je peux réaliser. Des pointeurs sur cela? Je pense que cela aiderait beaucoup de gros projets à profiler le code facilement sans un gros changement de code.
Voici l'idée. Il suffit de lancer le code ci-dessous dans la console firebug, pour savoir ce que j'essaie de réaliser.
var search=function(){ this.init=function(){ console.log('init'); } this.ajax=function(){ console.log('ajax'); //make ajax call using $.ajax and do some DOM manipulations here.. } this.cache=function(){ console.log('cache'); } } var instance=new search(); $.each(instance, function(functionName, functionBody){ (function(){ var dup=functionBody functionBody=function(){ console.log('modifying the old function: ',functionName); console.profile(functionName); dup.apply(this,arguments); console.profileEnd(functionName); } })(); console.log(functionName, '::', functionBody()); });
Maintenant, ce que je dois, si je dis instance.ajax(), je veux la nouvelle méthode ajax() d'être appelé, ainsi que les déclarations console.profile. J'espère que je suis clair avec l'exigence. S'il vous plaît improviser le code ci-dessus.
Cordialement, Krishna, http://www.novogeek.com
Salut J-P, Merci pour la réponse rapide. J'ai raté le paramètre de retour. C'est ce que je cherchais. Alors maintenant, je peux assigner ce $ .each à une variable (par exemple, newInstance) et dire newInstance.init() qui modifie le init original et lui ajoute des instructions de profil. – novogeek
Hi James, Que faire si j'ai des fonctions privées dans la même fonction "search()"? Évidemment, ils ne seront pas disponibles sous l'instance. Alors, y a-t-il un moyen de gérer cela? – novogeek
@ novogeek, Ne pas utiliser cette technique. Pour le faire fonctionner sur des fonctions "privées", vous devrez les changer manuellement ... – James