variable objetos log chrome javascript function logging hook

javascript - objetos - console.log variable



Añadiendo console.log a cada función automáticamente (4)

¿Hay alguna forma de hacer que cualquier función genere una instrucción console.log cuando se llame registrando un enlace global en alguna parte (es decir, sin modificar la función real) o por algún otro medio?


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

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

Es un "hack rápido y sucio", pero me parece ú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.


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

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 inconveniente es que ninguna función creada después del augment llamada tendrá el comportamiento adicional.


En realidad, 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); }


Si desea un registro más específico, el siguiente código registrará las llamadas a funciones 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);