Подтвердить что ты не робот

Перехватить вызовы в console.log в Chrome.

У меня есть script, который я не могу изменить, что вызывает много вызовов console.log. Я хочу добавить еще один слой и ответить, если вызовы содержат определенные строки. Это работает в FF, но в 4-й строке в Chrome появляется ошибка "Недействительный вызов":

var oldConsole = {};
oldConsole.log = console.log;
console.log = function (arg) {
    oldConsole.log('MY CONSOLE!!');
    oldConsole.log(arg);
}

Любые идеи, как обойти это? Я также попытался клонировать консоль...

4b9b3361

Ответ 1

Вам нужно позвонить console.log в контексте console для chrome:

(function () {
  var log = console.log;
  console.log = function () {
    log.call(this, 'My Console!!!');
    log.apply(this, Array.prototype.slice.call(arguments));
  };
}());

Ответ 2

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

if(window.console){
  console.yo = console.log;
  console.log = function(str){
    console.yo('MY CONSOLE!!');
    console.yo(str);
  }
}

Ответ 3

С новым оператором распространения ES6 вы можете написать его так:

(function () {
  var log = console.log;
  console.log = function () {
    log.call(this, 'My Console!!!', ...arguments);
  };
}());

Ответ 4

Я знаю, что это старый пост, но он может быть полезен, так как другие решения не совместимы со старыми браузерами.

Вы можете переопределить поведение каждой функции консоли (и всех браузеров) следующим образом:

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