2013-03-27 97 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;