2012-06-22 11 views
5

Ho alcuni comandi di console.log diffusi attraverso il mio sito.Posso creare una mia funzione con lo stesso nome di una esistente per personalizzarla?

È possibile sovrascrivere console.log con la mia funzione? Voglio personalizzare la funzione in modo che registri solo se una variabile specifica è impostata su true.

Alla fine, avrei ancora bisogno di chiamare il vero console.log da questa funzione.

Grazie Kevin

+2

Forse sarebbe stato più veloce di provare proprio questo. –

+0

JavaScript non è altro che un altro linguaggio di programmazione. Dovrebbe supportare l'override. –

+3

@UmeshA Questa è una cattiva ipotesi. PHP, ad esempio, non consente funzioni di override. L'override della funzione è un concetto difficile da ottenere in alcune lingue, in particolare quelle native in cui il nome della funzione viene convertito in una posizione dal compilatore. – Christian

risposta

4

Basta creare una chiusura, e memorizzare la funzione originale console.log in una variabile locale.
poi sovrascrivere console.log, e chiamare la funzione originale dopo che fate il vostro controllo:

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

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

Ecco il violino: http://jsfiddle.net/J46w8/

+0

Ben fatto. Mi chiedo, però, quale sia il parametro 'this' per' console.log' ... forse l'oggetto 'window'? È documentato da qualche parte? – voithos

+0

@voithos - 'this' sarebbe l'oggetto' console', poiché viene chiamato come metodo. [Vedi qui] (http://jsfiddle.net/EbjPV/). –

+0

Ah, giusto. Silly me. _Ma_, se è così, allora dovresti mandare 'console' nel tuo' .apply() '. Ecco un aggiornamento del tuo violino che mostra che 'this' non è l'oggetto console, nella tua nuova funzione: [http://jsfiddle.net/voithos/J46w8/1/](http://jsfiddle.net/voithos/J46w8/1 /) – voithos

0

Salva il vecchio console.log() prima.

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); 
}; 
Problemi correlati