2013-03-27 211 views
7

我想覆盖console.log并在我的新功能上调用它。Javascript - 覆盖console.log并保留旧功能

我尝试这样的事情,但我得到Uncaught TypeError: Illegal invocation

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

console.log('as'); 

这是我的目标:

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

编辑: 事实上,它工作在Firefox和不在Chrome ... 这是Chrome中的一个错误:https://code.google.com/p/chromium/issues/detail?id=167911

+0

这很难说,你的目标是什么。在调用console.log时以及调用原始的console.log时是否要调用不同的函数? – DCoder 2013-03-27 11:27:48

+0

我编辑添加我的目标。 – Charles 2013-03-27 11:30:40

回答

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); 
     } 
    } 
})(); 
+1

:)我只是调整你的代码,如果你检查'exception ''实际上是一个对象,在'typeof exception.stack'之前不是'null',否则你可能会有一些异常。 – ZER0 2013-03-27 14:41:18

1

试试这个:

var console={ 
    log: function(v){ 
     alert(v); 
    } 
}; 
console.log('hello world'); 

UPD:

检查:

var originalConsole={ 
    log: (function(c){ 
     return function(v){ 
      c.log(v); 
     }; 
    }(window.console)) 
}; 
var console={ 
    log: function(v){ 
     originalConsole.log('_original_'); 
     originalConsole.log(v); 
    } 
}; 
console.log('hello world'); 

originalConsole店原console对象所需的方法(只log在我的例子),那么console会被新的o覆盖东北。

UPD2

var console=(function(c){ 
    return { 
     log: function(v){ 
      c.log('_original_'); 
      c.log(v); 
     } 
    }; 
}(window.console)); 
console.log('hello world'); 

我希望这会帮助你。

+0

谢谢,但我不想提醒,我想在控制台中打印。 – Charles 2013-03-27 11:31:34

+0

@charles:好的,所以你想用新的替换原来的'console',并从新的调用原始的。正确? – 2013-03-27 11:34:12

+0

是的,这正是我想要的 – Charles 2013-03-27 11:35:46

0

您正在调用window对象上的console.log函数。您应该在console对象上调用它。

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

console.log('as'); 
0

我会建议使用:https://github.com/sunnykgupta/jsLogger

特点:

  1. 它安全地覆盖的console.log。
  2. 请注意,如果控制台不可用(哦,是的,您也需要考虑这一点。)
  3. 存储所有日志(即使它们被禁止)供以后检索。
  4. 处理主要控制台功能,如log,warn,error,info

对修改是开放的,每当有新的建议出现时都会更新。

免责声明:我是插件的作者。

3

最好的方式来实现你想要什么:

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