コンソールオブジェクトを拡張することは可能ですか?
私は次のようなことを試しました:
Console.prototype.log = function(msg){
Console.prototype.log.call(msg);
alert(msg);
}
しかし、これはうまくいきませんでした。 log4javascript のようなフレームワークを介してコンソールオブジェクトにログを追加し、コードで標準のコンソールオブジェクト(log4javascriptが使用できない場合)を使用したいと思います。
前もって感謝します!
次のことを試してください。
(function() {
var exLog = console.log;
console.log = function(msg) {
exLog.apply(this, arguments);
alert(msg);
}
})()
この方法でログ時間を追加することもできます:
momentjsを追加するか、momentの代わりにNew Date()を使用します。
var oldConsole = console.log;
console.log = function(){
var timestamp = "[" + moment().format("YYYY-MM-DD HH:mm:ss:SSS") + "] ";
Array.prototype.unshift.call(arguments, timestamp);
oldConsole.apply(this, arguments);
};
ECMAScript 2015 標準の新しい Proxy 機能を使用して、グローバル console.log を「ハイジャック」できます。
'use strict';
class Mocker {
static mockConsoleLog() {
Mocker.oldGlobalConsole = window.console;
window.console = new Proxy(window.console, {
get(target, property) {
if (property === 'log') {
return function(...parameters) {
Mocker.consoleLogReturnValue = parameters.join(' ');
}
}
return target[property];
}
});
}
static unmockConsoleLog() {
window.console = Mocker.oldGlobalConsole;
}
}
Mocker.mockConsoleLog();
console.log('hello'); // nothing happens here
Mocker.unmockConsoleLog();
if (Mocker.consoleLogReturnValue === 'hello') {
console.log('Hello world!'); // Hello world!
alert(Mocker.consoleLogReturnValue);
// anything you want to do with the console log return value here...
}
Repl.it 。
... 私はあなたを忘れません。このソースコードを取得し、window.console
をgloabl.console
に置き換えて、コンソールオブジェクトを適切に参照できます(もちろん、alert
呼び出しを削除します)。実際、私は最初にこのコードを作成し、Node.jsでテストしました。
// console aliases and verbose logger - console doesnt prototype
var c = console;
c.l = c.log,
c.e = c.error,
c.v = c.verbose = function() {
if (!myclass || !myclass.verbose) // verbose switch
return;
var args = Array.prototype.slice.call(arguments); // toArray
args.unshift('Verbose:');
c.l.apply(this, args); // log
};
// you can then do
var myclass = new myClass();
myclass.prototype.verbose = false;
// generally these calls would be inside your class
c.v('1 This will NOT log as verbose == false');
c.l('2 This will log');
myclass.verbose = true;
c.v('3 This will log');
上記のniteshによるArray.prototype.unshift.callの使用は、「Verbose:」タグを追加するためのより良い方法であることに注意しました。
これは他の人が与えたのと本当に同じ解決策ですが、これはこれを達成するための最もエレガントでハックの少ない方法だと思います。拡散構文(... args)は 単一の引数が失われないことを確認してください になります。
var _console={...console}
console.log = function(...args) {
var msg = {...args}[0];
//YOUR_CODE
_console.log(...args);
}