是否可以扩展控制台对象?
我尝试了以下代码:
Console.prototype.log = function(msg){
Console.prototype.log.call(msg);
alert(msg);
}
但这个方法没有起作用。我想通过像log4javascript这样的框架向控制台对象添加额外的日志记录,并在我的代码中仍然使用标准的控制台对象(在log4javascript不可用的情况下)。
先感谢您!
是否可以扩展控制台对象?
我尝试了以下代码:
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);
}
})()
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);
};
您可以使用新的代理(proxy)功能来“劫持”全局的console.log,该功能是从ECMAScript 2015标准中引入的。
'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提供了在线演示。
如果你在使用Node.js,可以使用此源代码,并将window.console
替换为global.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');
您可以使用以下方法覆盖console.log
函数的默认行为,下面的示例演示了如何使用重写的函数记录行号。
let line = 0;
const log = console.log;
console.log = (...data) => log(`${++line} ===>`, ...data)
console.log(11, 1, 2)
console.log(11, 1, 'some')
Console
对象本身?您是否曾调用过new Console()
? - biziclop