2010-10-12 12 views
12

Quiero envolver todas las llamadas de función con algún código de registro. Algo que produciría una salida como:¿Hay alguna manera de ajustar todos los métodos de JavaScript con una función?

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

Idealmente, me gustaría una API de la forma:

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

He buscado en Google un poco para esto, pero parece que sólo hay aspect- soluciones orientadas que requieren que envuelva las funciones específicas que desea registrar, o lo que sea. Quiero algo que se aplique a todas las funciones en el ámbito global (excepto a sí mismo, obviamente).

+0

¿Desea envolver las llamadas a la versión i n función (como 'window.alert'), o solo funciones definidas por el usuario? –

+0

Idealmente, todo. Podría escribir cosas para buscar, ordenar y filtrar más tarde. – blake8086

Respuesta

10

Un enfoque simple sería algo como esto

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 .. 
     } 
     })(); 
    } 
} 

Para deshacer lo que se necesita para ejecutar los

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

Notas
Esto sólo se ocupa de las funciones globales, pero se puede ampliar fácilmente para manejar objetos o métodos específicos, etc.

+0

Bastante dulce, esto es más que suficiente para comenzar. ¡Gracias! – blake8086

+0

@blake, eres bienvenido .. –

+1

Si defines tus funciones globales como 'function myFunction() {...}' o 'var myFunction = function() {...}', esto no funcionará IE8 o inferior (pero lo hace en IE9 beta!) Porque no se enumerarán. Para que esto funcione en IE8 o inferior, necesitarás definir tus funciones en su lugar como 'this.myFunction = function() {...}' o 'window.myFunction = function() {...}'. – gilly3

0

Tal vez usted podría tener una función a la que se pasa a la función de ejecutar como un parámetro:

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

    func_to_run(); 

} 

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

runner(test) 
Cuestiones relacionadas