2012-02-09 5 views
23

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

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

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

ответ

29

Вы должны вызвать console.log в контексте console для хрома:

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

хорошо ... долго искал что-то вроде этого. Может ли это использоваться для украшения любой функции в javascript? – Shane

+2

@Shane, это основной шаблон для перехвата вызова функции, однако я бы рекомендовал не использовать его, если это абсолютно необходимо. Гораздо лучше просто изменить функцию напрямую или использовать концепции ООП. – zzzzBov

+0

создание структуры, в которой есть много времени сборки компонентов, это было бы удобным инструментом для внешнего подхода к отладке компонентов или модификации существующих компонентов с помощью плагинов и т. Д. Есть ли успех для этого подхода? Просто любопытно, какие будут недостатки. Я не буду изменять внутренние функции, а только методы составных компонентов. – Shane

4

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

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

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

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

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

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

// 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; 
Смежные вопросы