2011-02-17 9 views
71

¿Hay alguna manera de hacer que cualquier función genere una declaración console.log cuando se invoca registrando un enlace global en alguna parte (es decir, sin modificar la función real) o por algún otro medio ?Agregando console.log a cada función automáticamente

+0

pregunta excelente, me gustaría saber si esto es posible, pero estoy bastante seguro de que no es ... Tal vez, agregue una solicitud de función para que se agregue en el motor js para su navegador favorito ? :-) – Endophage

+0

Pregunta perfecta, necesito algo similar como este – mjimcua

Respuesta

52

Aquí está una manera de aumentar todas las funciones en el espacio de nombres global con la función que desee:

function augment(withFn) { 
    var name, fn; 
    for (name in window) { 
     fn = window[name]; 
     if (typeof fn === 'function') { 
      window[name] = (function(name, fn) { 
       var args = arguments; 
       return function() { 
        withFn.apply(this, args); 
        return fn.apply(this, arguments); 

       } 
      })(name, fn); 
     } 
    } 
} 

augment(function(name, fn) { 
    console.log("calling " + name); 
}); 

Un aspecto negativo es que no hay funciones creadas después de llamar augment tendrán el comportamiento adicional.

+0

¿Maneja correctamente los valores de retorno de la función? – SunnyShah

+2

@SunnyShah No, no lo hace: http://jsfiddle.net/Shawn/WnJQ5/ Pero este hace: http://jsfiddle.net/Shawn/WnJQ5/1/ aunque no estoy seguro de que funcione en TODOS los casos ... La diferencia está cambiando 'fn.apply (this, arguments);' to 'return fn.apply (this, arguments);' – Shawn

+2

@Shawn @SunnyShah Fixed. Solo necesitaba agregar un 'return' a la función más interna. –

-2

Puede adjuntar su propia función a console.log para todo lo que se carga.

console.log = function(msg) { 
    // Add whatever you want here 
    alert(msg); 
} 
+12

¿Debo explicar mi voto negativo? – vladkras

+0

esto es 100% correcto –

-1

Aquí hay un poco de Javascript que reemplaza agrega console.log a cada función en Javascript; Jugar con él en Regex101:

$re = "/function (.+)\\(.*\\)\\s*\\{/m"; 
$str = "function example(){}"; 
$subst = "$& console.log(\"$1()\");"; 
$result = preg_replace($re, $subst, $str); 

Es un 'rápido y sucio truco', pero me parece que es útil para la depuración. Si tiene muchas funciones, tenga cuidado porque esto agregará mucho código. Además, el RegEx es simple y podría no funcionar para nombres/declaraciones de funciones más complejas.

1

Si desea un registro más específico, el siguiente código registrará las llamadas de función para un objeto en particular. Incluso puede modificar prototipos de objetos para que todas las instancias nuevas también se registren. Usé Object.getOwnPropertyNames en lugar de ... in, por lo que funciona con las clases de ECMAScript 6, que no tienen métodos enumerables.

function inject(obj, beforeFn) { 
    for (let propName of Object.getOwnPropertyNames(obj)) { 
     let prop = obj[propName]; 
     if (Object.prototype.toString.call(prop) === '[object Function]') { 
      obj[propName] = (function(fnName) { 
       return function() { 
        beforeFn.call(this, fnName, arguments); 
        return prop.apply(this, arguments); 
       } 
      })(propName); 
     } 
    } 
} 

function logFnCall(name, args) { 
    let s = name + '('; 
    for (let i = 0; i < args.length; i++) { 
     if (i > 0) 
      s += ', '; 
     s += String(args[i]); 
    } 
    s += ')'; 
    console.log(s); 
} 

inject(Foo.prototype, logFnCall); 
Cuestiones relacionadas