Окно Access.console после перезаписывания

Возможно ли каким-то образом получить доступ к console.log после его перезаписывания?

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

Можно ли восстановить исходную функциональность console.log?

Ответ 1

Вы можете создать резервную копию консоли, прежде чем перезаписывать ее.

var oldConsole = window.console;
window.console = { log:function(msg){alert(msg)} //...};

Затем вы можете использовать переменную oldConsole.

oldConsole.log('test');

Если вы не можете создать резервную копию, вы можете создать iFrame, а затем украсть консоль (это может не работать во всех браузерах):

var i = document.createElement('iframe');
i.style.display = 'none';
document.body.appendChild(i);
window.console = i.contentWindow.console;

Демо: http://jsfiddle.net/jcG7E/2

Ответ 2

Изменить (2017-04-08): этот совет устарел, в Firefox 52 и Chrome 57 console больше не определен в прототипе окна, и удаление его действительно удалит.


По крайней мере, с объектом console, определенным Firefox и Chrome, вы можете просто удалить перезаписанное свойство, чтобы восстановить исходное:

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

Это работает так, как будто свойство console было определено в прототипе объекта window - за исключением того, что это не так, браузеры здесь делают магию.

Ответ 3

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

}

Ответ 4

Это невозможно. За исключением того, что тот, кто его перезаписал, включил некоторый код, чтобы отменить его.