我想编写一些可以像下面的代码一样使用的日志类。
// short-hand for logging.
log('log message', [other parameter]);
// full path for writing log.
log.write('log message', [other parameter]);
// print all log
log.print([optional parameter]);
此外,它必须能够写成流畅的模式。
log.write('log message').print();
最后,应使用以下代码重置它。
log = new log();
谢谢,
答案 0 :(得分:3)
让我们首先将它作为普通对象实现,然后在以下后面添加一些其他语法:
var log = {};
log.write = function() {
// stuff...
return this;
};
log.print = function() {
// stuff...
return this;
};
log.reset = function() {
// stuff
return this;
};
由于函数也是一个对象,它可以具有属性,因此您可以使用重定向到var log = {};
的函数替换log.write
。
function log() {
return log.write.apply(log, arguments);
}
最后,对于自重置语法,您可以检测新实例,但不是创建新对象,而是重置日志并将同一个对象交还回来!
所以现在日志功能将如下所示:
function log() {
if (this instanceof log) {
return log.reset.apply(log, arguments);
}
return log.write.apply(log, arguments);
}
您可以查看jsFiddle以了解它是否有效。警告:该页面上有很多alert()!
答案 1 :(得分:1)
var Logger = function(msg,p){
this.msg = typeof msg != 'undefined' ? msg : '';
this.p = typeof p != 'undefined' ? p : '';
}
Logger.prototype = {
write : function(msg,p){
this.msg = typeof msg != 'undefined' ? msg : '';
this.p = typeof p != 'undefined' ? p : '';
},
print : function(p){
this.p = typeof p == 'undefined' ? this.p : p;
if(this.p)
alert(this.msg);
else
console.log(this.msg);
return this;
},
reset : function(){
return new Logger();
}
}
function log(msg,p){
return new Logger(msg,p).print();
}
然后你可以使用:
log("alert me",true);
log("log me in console!");
log().write("a msg",false).print();
var l = log();
l.write().print().reset();
答案 2 :(得分:1)
firebug中的console.log
不是为了记录的目的吗?虽然,人们可以编写自己的记录器实现。但问题是何时应该使用记录器?像你提出的类似的实现在服务器端运行的javascript中很有用,比如Rhino
但是我写了一些代码,请试试这个
<html>
<head>
<script>
var log = function() {
var p_this = this;
this.write = function(p_msg){
p_this.msg = p_msg;
return this.write;
},
this.write.print = function(){
alert(p_this.msg);
}
};
var log1 = new log();
log1.write('test_message').print();
</script>
</head>
<body>
</body>
</html>
这可能会有所帮助。这是你正在寻找的模式的概念代码。你必须修改它或改进它。您可以提供重置和所有的逻辑。
答案 3 :(得分:1)
你可以试试这个光荣的杰作:
var log = (function(out){
var msgs = [];
function log(msg){
if (typeof msg == 'string'){
msgs.push(msg);
return log;}
else{
msgs = [];
return log;}}
log.write = function(msg){
log(msg);
return log;};
log.print = function(){
for(var i=0, l=msgs.length; i<l; i++){
out(msgs[i]);}};
return log;})(function(s){console.log(s);});
最后注入实际输出函数。你应该测试console.log是否存在,否则使用另一种选择(我不知道你更喜欢什么)。
我尝试了以下事项:
log('First message');
log.write('Second message')('Third message').write('Fourth message');
log.write('Fifth message').print();
log.print(); // Prints all messages again.
log = new log(); // Reset.
log('Lonely!').print(); // Prints only 'Lonely!'.
注意:log();
或log(undefined);
(undefined
未定义)也会重置该内容,而new log('Foobar');
会添加消息'Foobar'
。但这不是你的测试用例,所以我忽略了它。
这也是可能的:
(new log()).write('Message');
(new log())('Message');
(new log()).print(); // Prints empty log.
答案 4 :(得分:0)
尝试查看JSLog javascript日志框架:
https://github.com/dingyonglaw/JSLog
它支持所有浏览器,还支持firebug-lite;
==============
Example Usage:
==============
Logging:
--------
// Register a module logger, p is now logger for 'App.Login'
var p = JSLog.Register('App.Login');
// Log something, and it will display "[App.Login] something" in your console;
p.log('something');
// You can do something as usual:
p.warn('warning!');
p.info('info msg');
Log Level:
----------
The Logger comes with 5 level of logging access: 1-5
which coresponding to: 'error', 'warn', 'info', 'debug', 'log'
// You can set your level like this, to display only info message in console
p.SetLevel(3);
// You can get your current logging level with:
p.GetLevel();
Logging History:
----------------
The logger records your logs and you can Dump it later!
// Dump by Module Name
JSLog.Dump('App.Login');
// Dump all modules in nested view
JSLog.Dump();
// Selective Dump by filtering module name:
JSLog.SetFilter('module-name');
JSLog.Dump(); // Will exclude 'module-name' module
// Clear filter by module name:
JSLog.UnsetFilter('module-name');
// Get assigned filters
JSLog.GetFilter();