2012-02-09 16 views
23

Tengo un script que no puedo cambiar que realiza muchas llamadas a console.log. Quiero agregar otra capa y responder si las llamadas contienen ciertas cadenas. Esto funciona en FF, pero lanza una "invocación ilegal" error en Chrome en la 4ª línea:Interceptar llamadas a console.log en Chrome

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

Alguna idea de cómo conseguir alrededor de eso? También probé la clonación de la consola ...

Respuesta

29

es necesario llamar a console.log en el contexto de console para Chrome:

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

buen ... estado buscando algo como esto. ¿Se puede usar esto para decorar cualquier función en javascript? – Shane

+2

@Shane, este es el patrón básico para interceptar una llamada a función, sin embargo, recomendaría no usarlo a menos que sea absolutamente necesario. Es mucho mejor modificar la función directamente o utilizar conceptos de OOP. – zzzzBov

+0

construyendo un marco donde hay mucho ensamblado de componentes de tiempo de ejecución, esta sería una herramienta útil para un enfoque externo para depurar componentes o modificar componentes existentes con complementos, etc. ¿Hay un impacto en el rendimiento para este enfoque? Solo curiosidad cuáles serían los inconvenientes. No modificaré funciones intrínsecas, solo métodos de componentes de marco. – Shane

4

También puede utilizar la misma lógica, pero llamarlo fuera del objeto por lo que la consola el contexto es lo mismo.

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

Con ES6 nuevo operador diferencial se puede escribir como esto

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

Sé que es una entrada antigua, pero puede ser útil de todos modos como solución de otros no son compatibles con los navegadores antiguos.

Puede volver a definir el comportamiento de cada función de la consola (y para todos los navegadores ) así:

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