是否可以扩展控制台对象?
我试过类似的东西:
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);
}
})()
您还可以通过这种方式添加日志时间:
添加 Momentjs 或使用New Date()而不是 moment。
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);
};
这确实与其他一些人给出的解决方案相同,但我相信这是实现这一目标的最优雅、最简单的方法。展开语法 (...args)确保不会丢失单个参数。
var _console={...console}
console.log = function(...args) {
var msg = {...args}[0];
//YOUR_CODE
_console.log(...args);
}
// 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:' 标签的更好方法。
您可以使用ECMAScript 2015标准中较新的代理功能来“劫持”全局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...
}
复制它。
... 我不会忘记你。您可以使用此源代码并替换window.console
为gloabl.console
以正确引用控制台对象(当然,摆脱alert
调用)。事实上,我最初编写了这段代码并在 Node.js 上对其进行了测试。