2010-05-30 6 views
2

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

Répondre

2

Si vous voulez seulement modifier l'instance unique de « recherche », alors cela devrait fonctionner:

$.each(instance, function(name, method){ 
    if (typeof method !== 'function') return; 
    instance[name] = function() { 
     console.profile(name); 
     var ret = method.apply(this, arguments); 
     console.profileEnd(name); 
     return ret; 
    }; 
}); 
+0

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

+0

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

+0

@ novogeek, Ne pas utiliser cette technique. Pour le faire fonctionner sur des fonctions "privées", vous devrez les changer manuellement ... – James

0

Je sais que cela est d'il y a longtemps, mais Je voulais ajouter ceci au cas où d'autres personnes trouveraient cette réponse. Vous pouvez faire fonctionner les fonctions anonymes/privées en ajoutant un nom à chacune d'elles. Les autres commentaires mentionnent le faire, je mordit manuellement voulu expliquer comment:

$('.stuff').each(function() { ... });

à

$('.stuff').each(function workOnStuff() { ... });

Questions connexes