截取Chrome中对console.log的调用

spr*_*man 27 javascript debugging console

我有一个我无法更改的脚本,它会调用很多console.log.我想添加另一个图层并在调用包含某些字符串时进行响应.这适用于FF,但在第4行Chrome中引发了"非法调用"错误:

var oldConsole = {};
oldConsole.log = console.log;
console.log = function (arg) {
    oldConsole.log('MY CONSOLE!!');
    oldConsole.log(arg);
}
Run Code Online (Sandbox Code Playgroud)

任何想法如何解决?我也试过克隆控制台......

zzz*_*Bov 38

您需要console.logconsolechrome 的上下文中调用:

(function () {
  var log = console.log;
  console.log = function () {
    log.call(this, 'My Console!!!');
    log.apply(this, Array.prototype.slice.call(arguments));
  };
}());
Run Code Online (Sandbox Code Playgroud)

  • @Shane,这是拦截函数调用的基本模式,但是除非绝对必要,否则我建议不要使用它.直接修改函数或使用OOP概念要好得多. (2认同)
  • 这不能准确报告行号 (2认同)

Lud*_*ltz 6

我知道这是一篇旧帖子,但无论如何它都会很有用,因为其他解决方案与旧浏览器不兼容。

您可以像这样重新定义控制台(以及所有浏览器)的每个功能的行为:

// define a new console
var console = (function(oldCons){
    return {
        log: function(text){
            oldCons.log(text);
            // Your code
        },
        info: function (text) {
            oldCons.info(text);
            // Your code
        },
        warn: function (text) {
            oldCons.warn(text);
            // Your code
        },
        error: function (text) {
            oldCons.error(text);
            // Your code
        }
    };
}(window.console));

//Then redefine the old console
window.console = console;
Run Code Online (Sandbox Code Playgroud)


rgt*_*ree 5

您也可以使用相同的逻辑,但是从控制台对象中调用它以使上下文相同.

if(window.console){
  console.yo = console.log;
  console.log = function(str){
    console.yo('MY CONSOLE!!');
    console.yo(str);
  }
}
Run Code Online (Sandbox Code Playgroud)