Pregunta Añadiendo console.log a cada función automáticamente


¿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?


76
2018-02-17 19:51


origen


Respuestas:


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 no hay funciones creadas después de llamar augment tendrá el comportamiento adicional.


57
2018-02-17 21:06



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);

1
2017-07-26 05:10



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.


0
2017-12-25 05:35



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

-3
2017-08-12 07:59