2012-06-22 23 views
5

Tengo algunos comandos console.log extendidos a través de mi sitio.¿Puedo crear mi propia función con el mismo nombre que una existente para personalizarla?

¿Es posible anular console.log con mi propia función? Quiero personalizar la función para que solo se registre si una variable específica está configurada en verdadero.

Al final, aún necesitaría llamar al console.log real desde esta función.

Gracias Kevin

+2

Podría haber sido más rápido a modo de prueba. –

+0

JavaScript no es más que otro lenguaje de programación. Debería apoyar la anulación. –

+3

@UmeshA Esa es una mala suposición. PHP, por ejemplo, no permite funciones anuladas. La anulación de funciones es un concepto que es difícil de conseguir en algunos idiomas, especialmente en los nativos, donde el compilador convierte un nombre de función en una ubicación. – Christian

Respuesta

4

Basta con crear un cierre, y almacenar la función original console.log en una variable local.
Entonces anulan console.log, y llame a la función original después de hacer su cheque:

(function(){ 
    var original = console.log; 

    console.log = function(){ 
     if (log) { // <-- some condition 
      original.apply(this, arguments); 
     } 
    }; 
})(); 

Aquí está el violín: http://jsfiddle.net/J46w8/

+0

Bien hecho. Me pregunto, sin embargo, qué se supone que es el parámetro 'this' para' console.log' ... ¿quizás el objeto 'window'? ¿Está esto documentado en algún lugar? – voithos

+0

@voithos - 'this' sería el objeto' console', ya que está siendo llamado como su método. [Ver aquí] (http://jsfiddle.net/EbjPV/). –

+0

Ah, a la derecha. Tonto de mí. _Pero_, si es así, entonces deberías estar enviando 'console' en tu' .apply() '. Aquí hay una actualización de su violín que muestra que 'this' no es el objeto de la consola, en su nueva función: [http://jsfiddle.net/voithos/J46w8/1/](http://jsfiddle.net/voithos/J46w8/1 /) – voithos

0

Guardar el viejo console.log() primero.

var reallog = console.log; 
console.log = function(s) { 
    if(s == "a") { 
     reallog("a"); 
    } 
} 
console.log("b"); 
0
console.constructor.prototype.log = function(msg) { 
    alert(msg); 
}; 
Cuestiones relacionadas