在 Chrome 中拦截对 console.log 的调用

IT技术 javascript debugging console
2021-02-27 08:55:27

我有一个无法更改的脚本,它会进行大量console.log调用。如果调用包含某些字符串,我想添加另一个层并做出响应。这在 Firefox 中有效,但Illegal invocation在 Chrome 中的第 4 行引发“ ”错误:

var oldConsole = {};
oldConsole.log = console.log;
console.log = function (arg) {
    oldConsole.log('MY CONSOLE!!');
    oldConsole.log(arg);
}

任何想法如何解决这个问题?我也尝试克隆控制台...

6个回答

您需要console.logconsolefor chrome的上下文中调用

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

现代语言功能可以显着简化此代码段:

{
  const log = console.log.bind(console)
  console.log = (...args) => {
    log('My Console!!!')
    log(...args)
  }
}
构建一个框架,其中有很多组件的运行时组装,这将是一个方便的工具,用于外部驱动的方法来调试组件或使用插件修改现有组件等。这种方法是否会影响性能?只是好奇会有什么缺点。我不会修改内部函数,只会修改框架组件方法。
2021-04-15 08:55:27
@Shane,这是拦截函数调用的基本模式,但是除非绝对必要,否则我建议不要使用它。最好直接修改函数,或者使用 OOP 概念。
2021-05-08 08:55:27
看起来函数链接要快得多。刚刚做了一个测试。 jsperf.com/wrapped-function
2021-05-10 08:55:27
不错...一直在寻找这样的东西。这可以用来装饰javascript中的任何函数吗?
2021-05-11 08:55:27
您调用的每个函数都是“性能损失”,但偶尔触发的异步 JavaScript 不应显着停滞。
2021-05-12 08:55:27

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

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

// 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;
对于此类问题,我见过的最干净的答案
2021-04-20 08:55:27
2021-05-14 08:55:27

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

if(window.console){
  console.yo = console.log;
  console.log = function(str){
    console.yo('MY CONSOLE!!');
    console.yo(str);
  }
}

使用 ES6 新的扩展运算符,您可以这样编写

(function () {
  var log = console.log;
  console.log = function () {
    log.call(this, 'My Console!!!', ...arguments);
  };
}());

可以简单地:

console.log = (m) => terminal.innerHTML = JSON.stringify(m)
#terminal {background: black; color:chartreuse}
$ > <span id="terminal"></span>
<hr>        
<button onclick="console.log('Hello world!!')">3V3L</button>
<button onclick="console.log(document)">3V3L</button>
<button onclick="console.log(Math.PI)">3V3L</button>