2013-03-27 5 views
7

Vorrei scavalcare console.log e chiamarlo sulla mia nuova funzione.Javascript - Sostituisci console.log e mantieni la vecchia funzione

provo qualcosa di simile ma ottengo Uncaught TypeError: Illegal invocation:

console.log = function() { 
    this.apply(window, arguments); 
}.bind(console.log); 

console.log('as'); 

Questo è il mio obiettivo:

console.error(exception); dovrebbe fare:

console.error = function() { 
    if (typeof exception.stack !== 'undefined') { 
    console.error(exception.stack); 
    } else { 
    console.error.apply(windows, arguments); 
    } 
}.bind(console.error); 

console.error('as'); 
console.error({stack: 'my stack....'}); 

EDIT: In realtà, funziona in firefox e non in Chrome ... È un bug in Chrome : https://code.google.com/p/chromium/issues/detail?id=167911

+0

E 'difficile dire che cosa il vostro obiettivo è. Vuoi chiamare una funzione diversa quando viene chiamato 'console.log', oltre a chiamare l'originale' console.log'? – DCoder

+0

Mi sono alterato per aggiungere il mio obiettivo. – Charles

risposta

7

si può avere qualcosa di simile:

console.error = (function() { 
    var error = console.error; 

    return function(exception) { 
     if (typeof exception.stack !== 'undefined') { 
      error.call(console, exception.stack); 
     } else { 
      error.apply(console, arguments); 
     } 
    } 
})(); 
+1

:) Ho appena adattato il tuo codice, sarebbe molto meglio se controlli quell'eccezione 'è in realtà un oggetto e non è' null' prima di avere il 'typeof exception.stack', altrimenti potresti avere qualche eccezione. – ZER0

1

provare questo:

var console={ 
    log: function(v){ 
     alert(v); 
    } 
}; 
console.log('hello world'); 

UPD:

controllo questo:

var originalConsole={ 
    log: (function(c){ 
     return function(v){ 
      c.log(v); 
     }; 
    }(window.console)) 
}; 
var console={ 
    log: function(v){ 
     originalConsole.log('_original_'); 
     originalConsole.log(v); 
    } 
}; 
console.log('hello world'); 

originalConsole negozi metodi richiesti di originale console oggetto (solo log nel mio esempio), quindi console è annullato con nuovo o ne.

UPD2

var console=(function(c){ 
    return { 
     log: function(v){ 
      c.log('_original_'); 
      c.log(v); 
     } 
    }; 
}(window.console)); 
console.log('hello world'); 

Spero che questo vi aiuterà.

+0

Grazie ma non voglio un avviso, voglio stampare nella console. – Charles

+0

@charles: ok, quindi vuoi sostituire la 'console' originale con la nuova e chiamare quella originale da quella nuova. corretta? –

+0

sì, questo è esattamente quello che voglio – Charles

0

Si sta richiamando la funzione console.log sull'oggetto window. Dovresti invece richiamarlo sull'oggetto console.

console.log = function() { 
    this.apply(console, arguments); 
}.bind(console.log); 

console.log('as'); 
0

mi consiglia di utilizzare: https://github.com/sunnykgupta/jsLogger

Caratteristiche:

  1. Esso sovrascrive in modo sicuro il console.log.
  2. Fa attenzione se la console non è disponibile (oh sì, è necessario farlo anch'io.)
  3. Memorizza tutti i registri (anche se sono soppressi) per il successivo recupero.
  4. Gestisce le principali funzioni della console come log, warn, error, info.

È aperto per le modifiche e verrà aggiornato ogni volta che vengono visualizzati nuovi suggerimenti.

Disclaimer: Sono l'autore del plug-in.

3

Il modo migliore per ottenere ciò che si vuole:

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