Frage Hinzufügen von console.log zu jeder Funktion automatisch


Gibt es eine Möglichkeit, irgendeine Funktion zu veranlassen, eine console.log-Anweisung auszugeben, wenn sie aufgerufen wird, indem irgendwo ein globaler Haken registriert wird (dh ohne die eigentliche Funktion zu verändern) oder auf andere Weise?


76
2018-02-17 19:51


Ursprung


Antworten:


Hier ist eine Möglichkeit, alle Funktionen im globalen Namensraum mit der Funktion Ihrer Wahl zu ergänzen:

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

Ein Nachteil ist, dass nach dem Aufruf keine Funktionen erstellt werden augment wird das zusätzliche Verhalten haben.


57
2018-02-17 21:06



Wenn Sie eine gezieltere Protokollierung wünschen, protokolliert der folgende Code Funktionsaufrufe für ein bestimmtes Objekt. Sie können Objektprototypen sogar so ändern, dass auch alle neuen Instanzen protokolliert werden. Ich habe Object.getOwnPropertyNames anstelle von ... in verwendet, also funktioniert es mit ECMAScript 6-Klassen, die keine aufzählbaren Methoden haben.

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



Hier ist etwas Javascript, das ersetzt, fügt console.log zu jeder Funktion in Javascript; Spiele damit weiter Regex101:

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

Es ist ein "schneller und schmutziger Hack", aber ich finde es nützlich für das Debugging. Wenn Sie viele Funktionen haben, sollten Sie sich in Acht nehmen, denn dadurch wird viel Code hinzugefügt. Außerdem ist die RegEx einfach und funktioniert möglicherweise nicht für komplexere Funktionsnamen / Deklarationen.


0
2017-12-25 05:35



Sie können Ihre eigene Funktion an console.log für alles, was geladen wird, anhängen.

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

-3
2017-08-12 07:59