2010-10-12 2 views
12

Je veux emballer chaque appel de fonction avec du code de journalisation. Quelque chose qui produirait une sortie comme:Existe-t-il un moyen d'encapsuler toutes les méthodes JavaScript avec une fonction?

func1(param1, param2) 
func2(param1) 
func3() 
func4(param1, param2) 

Idéalement, je voudrais une API de la forme:

function globalBefore(func); 
function globalAfter(func); 

J'ai googlé un peu pour cela, mais il semble que il n'y a que aspect- solutions orientées qui vous obligent à envelopper les fonctions spécifiques que vous souhaitez vous connecter, ou autre chose. Je veux quelque chose qui s'applique à toutes les fonctions de la portée globale (sauf elle-même, évidemment).

+0

Voulez-vous placer les appels à n fonction (comme 'window.alert'), ou simplement des fonctions définies par l'utilisateur? –

+0

Idéalement, tout. Je pourrais écrire des trucs pour chercher, trier et filtrer plus tard. – blake8086

Répondre

10

Une approche simple serait quelque chose comme ça

var functionPool = {} // create a variable to hold the original versions of the functions 

for(var func in window) // scan all items in window scope 
{ 
    if (typeof(window[func]) === 'function') // if item is a function 
    { 
    functionPool[func] = window[func]; // store the original to our global pool 
    (function(){ // create an closure to maintain function name 
     var functionName = func; 
     window[functionName] = function(){ // overwrite the function with our own version 
     var args = [].splice.call(arguments,0); // convert arguments to array 
     // do the logging before callling the method 
     console.log('logging: ' + functionName + '('+args.join(',')+')'); 
     // call the original method but in the window scope, and return the results 
     return functionPool[functionName].apply(window, args); 
     // additional logging could take place here if we stored the return value .. 
     } 
     })(); 
    } 
} 

Pour annuler vous devez exécuter les

for (func in functionPool) 
    window[func] = functionPool[func]; 

Remarques
Ce ne gère que les fonctions globales, mais vous pouvez facilement étendre pour gérer des objets ou des méthodes spécifiques, etc.

+0

Assez doux, c'est plus que suffisant pour me lancer. Merci! – blake8086

+0

@blake, vous êtes les bienvenus .. –

+1

Si vous définissez vos fonctions Globally scoped comme 'function myFunction() {...}' ou 'var myFunction = function() {...}', cela ne fonctionnera pas dans IE8 ou ci-dessous (mais il fait dans IE9 bêta!) Parce qu'ils ne seront pas énumérés. Pour que cela fonctionne dans IE8 ou au-dessous, vous devrez définir vos fonctions à la place de 'this.myFunction = function() {...}' ou 'window.myFunction = function() {...}'. – gilly3

0

Peut-être que vous pourriez avoir une fonction à laquelle vous passez la fonction à exécuter en tant que paramètre:

function runner(func_to_run) { 
    alert('about to run ' + func_to_run.name); 

    func_to_run(); 

} 

function test() { 
    alert ('in test'); 
} 

runner(test) 
Questions connexes