Pertanyaan Menambahkan console.log ke setiap fungsi secara otomatis


Apakah ada cara untuk membuat output fungsi pernyataan console.log ketika dipanggil dengan mendaftarkan hook global di suatu tempat (yaitu, tanpa memodifikasi fungsi sebenarnya itu sendiri) atau melalui beberapa cara lain?


76
2018-02-17 19:51


asal


Jawaban:


Berikut adalah cara untuk menambah semua fungsi di ruang nama global dengan fungsi pilihan Anda:

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

Satu sisi adalah bahwa tidak ada fungsi yang dibuat setelah menelepon augment akan memiliki perilaku tambahan.


57
2018-02-17 21:06



Jika Anda ingin pencatatan yang lebih bertarget, kode berikut akan mencatat panggilan fungsi untuk objek tertentu. Anda bahkan dapat memodifikasi prototipe Objek sehingga semua instance baru mendapatkan pencatatan juga. Saya menggunakan Object.getOwnPropertyNames alih-alih untuk ... di, sehingga berfungsi dengan kelas ECMAScript 6, yang tidak memiliki metode enumerable.

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



Berikut beberapa Javascript yang menggantikan menambahkan console.log ke setiap fungsi di Javascript; Mainkan dengan itu Regex101:

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

Ini adalah 'hack cepat dan kotor' tetapi saya merasa berguna untuk debugging. Jika Anda memiliki banyak fungsi, berhati-hatilah karena ini akan menambahkan banyak kode. Juga, RegEx sederhana dan mungkin tidak berfungsi untuk nama / pernyataan fungsi yang lebih kompleks.


0
2017-12-25 05:35



Anda benar-benar dapat melampirkan fungsi Anda sendiri ke console.log untuk semua yang dimuat.

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

-3
2017-08-12 07:59