Javascript 覆盖后访问window.console

Javascript 覆盖后访问window.console,javascript,console,Javascript,Console,是否可以在覆盖console.log后以某种方式访问它 window.console = { log: function (msg) { alert(msg); }, /* etc... */ }; 是否可以恢复原始的console.log功能?您可以在覆盖控制台之前对其进行备份 var oldConsole = window.console; window.console = { log:function(msg){alert(msg)} //...}; 然后可以使用oldConsole变

是否可以在覆盖console.log后以某种方式访问它

window.console = { log: function (msg) { alert(msg); }, /* etc... */ };

是否可以恢复原始的console.log功能?

您可以在覆盖控制台之前对其进行备份

var oldConsole = window.console;
window.console = { log:function(msg){alert(msg)} //...};
然后可以使用
oldConsole
变量

oldConsole.log('test');
如果无法备份,可以创建iFrame,然后从中窃取控制台(这可能不适用于所有浏览器):


演示:

这是不可能的。除非覆盖它的人包含了一些代码来撤销它。

var customLog={
var customLog = {
    oriLog: '',
    Log: function(){
        // create string to display
        var displaystring = '';
        for (var i = 0, len = arguments.length; i < len; i++) {
            displaystring += arguments[i];
            if (i + 1 != len) 
                displaystring += ', ';
        }
        alert(displaystring);
        customLog.oriLog(arguments);
    }
}
window.onload = function(){
    if (console != null) {
        customLog.oriLog = console.log;
        console.log = customLog.Log;
    }

}
原始日志:“”, 日志:函数(){ //创建要显示的字符串 var displaystring=''; for(var i=0,len=arguments.length;i
编辑(2017-04-08):这个建议已经过时,在Firefox 52和Chrome 57
控制台中不再在窗口原型上定义,删除它将真正删除它


至少通过Firefox和Chrome定义的
控制台
对象,您可以简单地删除Overwrited属性以恢复原始属性:

window.console = {};
delete window.console;
window.console.log("This works!");

这就好像
控制台
属性是在
窗口
对象的原型上定义的一样-除了它不是,浏览器在这里发挥了一些魔力。

什么是原始属性?Firebug?下面的答案(删除window.console)更有用。我认为这应该是这个问题的公认答案。@RocketHazmat从iframe中窃取控制台的想法是一个相当不错的黑客行为!iFrame的解决方案是史诗般的,正是我所需要的。谢谢这在最新版本的Chrome中似乎不起作用。@RelaXNow:确实,这个建议过期了。我在上面加了一条注释。
window.console = {};
delete window.console;
window.console.log("This works!");