2013-03-27 13 views
7

Chciałbym zastąpić console.log i wywołać to na mojej nowej funkcji.Javascript - Zastąp konsolę.log i zachowaj starą funkcję

próbuję coś takiego, ale pojawia Uncaught TypeError: Illegal invocation:

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

console.log('as'); 

To jest mój cel:

console.error(exception); należy zrobić:

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: Właściwie, to działa w firefox i nie w Chrome ... To błąd w Chrome : https://code.google.com/p/chromium/issues/detail?id=167911

+0

Trudno powiedzieć, co jest twoim celem. Czy chcesz wywołać inną funkcję po wywołaniu 'console.log', a także wywołanie oryginalnego' console.log'? – DCoder

+0

Poddałem edycji mój cel. – Charles

Odpowiedz

7

Można mieć coś takiego:

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

:) Po prostu dostosuję twój kod, byłoby znacznie lepiej, gdybyś sprawdził, że 'wyjątek 'jest właściwie obiektem i nie ma wartości' null' przed 'typeof exception.stack', w przeciwnym razie mógłbyś mieć jakiś wyjątek. – ZER0

1

spróbować tego:

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

UPD:

czek to:

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 przechowuje wymagane metody oryginalnej console obiektu (tylko log w moim przykładzie) następnie console jest nadpisany nowym o ne.

UPD2

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

Mam nadzieję, że to pomoże.

+0

Dzięki, ale nie chcę alertu, chcę wydrukować w konsoli. – Charles

+0

@charles: ok, więc chcesz zastąpić oryginalną 'console' nową i zadzwonić oryginalną z nowej. poprawny? –

+0

Tak, dokładnie to chcę – Charles

0

Wywołujesz funkcję console.log na obiekcie window. Powinieneś go wywołać na obiekcie console.

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

console.log('as'); 
0

Polecam przy użyciu: https://github.com/sunnykgupta/jsLogger

funkcje:

  1. Jest bezpiecznie nadpisuje console.log.
  2. Zachowuje ostrożność, jeśli konsola nie jest dostępna (o tak, musisz to również uwzględnić.)
  3. Przechowuje wszystkie dzienniki (nawet jeśli są one wyłączone) w celu późniejszego pobrania.
  4. Obsługuje główne funkcje konsoli, takie jak: log, warn, error, info.

Jest otwarty na modyfikacje i będzie aktualizowany po pojawieniu się nowych sugestii.

Oświadczenie: Jestem autorem wtyczki.

3

Najlepszym sposobem, aby osiągnąć to, co chcesz:

// 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; 
Powiązane problemy