Javascript - 覆盖console.log并保留旧功能

Cha*_*les 7 javascript console overriding

我想覆盖console.log并在我的新函数上调用它.

我尝试这样的东西,但我得到Uncaught TypeError: Illegal invocation:

console.log = function() {
  this.apply(window, arguments);
}.bind(console.log);

console.log('as');
Run Code Online (Sandbox Code Playgroud)

这是我的目标:

console.error(exception); 应该做:

console.error = function() {
  if (typeof exception.stack !== 'undefined') {
    console.error(exception.stack);
  } else {
    console.error.apply(windows, arguments);
  }
}.bind(console.error);

console.error('as');
console.error({stack: 'my stack....'});
Run Code Online (Sandbox Code Playgroud)

编辑:实际上,它适用于Firefox而不是Chrome ... 这是Chrome中的一个错误:https://code.google.com/p/chromium/issues/detail?id = 167911

ZER*_*ER0 7

你可以有类似的东西:

console.error = (function() {
    var error = console.error;

    return function(exception) {
        if (typeof exception.stack !== 'undefined') {
            error.call(console, exception.stack);
        } else {
            error.apply(console, arguments);
        }
    }
})();
Run Code Online (Sandbox Code Playgroud)

  • :) 我只是修改了你的代码,如果你在有 `typeof exception.stack` 之前检查 `exception` 实际上是一个对象而不是 `null` 会更好,否则你可能会有一些异常。 (2认同)

Lud*_*ltz 7

实现您想要的最佳方式:

// 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)