È possibile dirottare funzioni JavaScript nel seguente modo:
(function(){
var oldLog = console.log;
console.log = function (message) {
// DO MESSAGE HERE.
oldLog.apply(console, arguments);
};
})();
- La linea 1 avvolge la funzione in una chiusura in modo che nessun'altra funzione abbia accesso diretto a
oldLog
(per motivi di manutenibilità).
- La riga 2 acquisisce il metodo originale.
- La riga 3 crea una nuova funzione.
- La riga 4 è dove si invia
message
al server.
- La riga 5 invoca il metodo originale come sarebbe stato gestito in origine.
apply
viene utilizzato in modo che possiamo invocarlo suconsole
utilizzando gli argomenti originali. Semplicemente chiamando oldLog(message)
non riuscirebbe perché log
dipende dalla sua associazione con console
.
Aggiornamento commento di Per zzzzBov di seguito, in IE9 console.log
non è in realtà una funzione così oldLog.apply
fallirebbe. Vedi console.log.apply not working in IE9 per maggiori dettagli.
fonte
2012-07-09 21:05:38
[Il tuo codice presenterà problemi in IE perché 'console.log' non è in realtà un'istanza' Function' in IE] (http://stackoverflow.com/questions/5538972/console-log-apply-not-working- in-IE9). – zzzzBov
@zzzzBov Interessante. Presumo che assegni 'console._oldLog = console.log; console._oldLog (messaggio); 'funzionerebbe, ma se' console' stesso è un oggetto ospitato, nessuna modifica è garantita da attaccare. Sfortunatamente, non ho IE per testarlo più. –
sì, si potrebbe ancora chiamare '_oldLog' in questo modo. 'oldLog = Function.prototype.bind.call (console.log, console)' funziona con IE9 +, ma richiede un polyfill per 'Function.prototype.bind' per IE8 e versioni successive. – zzzzBov