Câu hỏi Thêm console.log vào mọi chức năng tự động


Có cách nào để thực hiện bất kỳ chức năng đầu ra một tuyên bố console.log khi nó được gọi bằng cách đăng ký một móc toàn cầu ở đâu đó (có nghĩa là, mà không sửa đổi các chức năng thực tế chính nó) hoặc thông qua một số phương tiện khác?


76
2018-02-17 19:51


gốc


Câu hỏi tuyệt vời, tôi rất muốn biết nếu điều này là có thể nhưng tôi khá chắc chắn nó không phải là ... Có lẽ thêm một yêu cầu tính năng cho nó được thêm vào trong công cụ js cho trình duyệt yêu thích của bạn? :-) - Endophage
Câu hỏi hoàn hảo, tôi cần một cái gì đó tương tự như thế này - mjimcua


Các câu trả lời:


Đây là một cách để tăng thêm tất cả các hàm trong không gian tên chung với hàm bạn chọn:

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

Một bên là không có chức năng nào được tạo sau khi gọi augment sẽ có hành vi bổ sung.


57
2018-02-17 21:06



Nó có xử lý các giá trị trả về của hàm đúng không? - SunnyShah
@SunnyShah Không, nó không: jsfiddle.net/Shawn/WnJQ5 Nhưng điều này có: jsfiddle.net/Shawn/WnJQ5/1 mặc dù tôi không chắc chắn nó sẽ làm việc trong TẤT CẢ các trường hợp ... Sự khác biệt đang thay đổi fn.apply(this, arguments); đến return fn.apply(this, arguments); - Shawn
@Shawn @SunnyShah Đã sửa lỗi. Chỉ cần thêm một return đến chức năng bên trong nhất. - Wayne Burkett
hoạt động gần như tốt nhưng tôi nhận được một lỗi với jquery này: call: if (jQuery.isFunction (lSrc)) và nó nói: TypeError: jQuery.isFunction không phải là một hàm - fekiri malek
Giải pháp này không sử dụng jQuery - Wayne Burkett


Nếu bạn muốn ghi nhật ký được nhắm mục tiêu nhiều hơn, mã sau sẽ ghi lại các cuộc gọi hàm cho một đối tượng cụ thể. Bạn thậm chí có thể sửa đổi nguyên mẫu Object để tất cả các cá thể mới cũng có thể ghi nhật ký. Tôi đã sử dụng Object.getOwnPropertyNames thay vì cho ... in, do đó, nó hoạt động với các lớp ECMAScript 6, mà không có phương pháp đếm được.

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





Dưới đây là một số Javascript thay thế thêm console.log vào mọi hàm trong Javascript; Chơi với nó trên Regex101:

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

Đó là một 'hack nhanh chóng và bẩn' nhưng tôi thấy nó hữu ích cho việc gỡ lỗi. Nếu bạn có rất nhiều chức năng, hãy cẩn thận vì điều này sẽ thêm rất nhiều mã. Ngoài ra, RegEx rất đơn giản và có thể không hoạt động đối với các tên / khai báo hàm phức tạp hơn.


0
2017-12-25 05:35





Bạn thực sự có thể đính kèm chức năng của riêng bạn vào console.log cho mọi thứ tải.

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

-3
2017-08-12 07:59



Tôi có phải giải thích cho tôi không? - vladkras
điều này đúng 100% - Sebastian Karlsson