是否可以编写这样的JavaScript日志类?

时间:2011-05-07 07:09:06

标签: javascript design-patterns

我想编写一些可以像下面的代码一样使用的日志类。

// 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();

谢谢,

5 个答案:

答案 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();