Можно ли написать класс журнала JavaScript, как это? - PullRequest
4 голосов
/ 07 мая 2011

Я хочу написать некоторый класс журнала, который можно использовать, как в следующем коде.

// 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 ]

3 голосов
/ 07 мая 2011

Давайте сначала реализуем его как обычный объект, а затем добавим несколько других синтаксисов:

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 , чтобы убедиться, что он работает. Предупреждение: много предупреждений на этой странице!

1 голос
/ 07 мая 2011

Разве console.log в firebug не предназначен для регистрации? Хотя, можно написать собственную реализацию логгера. Но вопрос в том, когда следует использовать регистратор? Реализация, подобная предложенной вами, может быть полезна в 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>

Это может быть полезно. Это концептуальный код для шаблона, который вы ищете. Вы должны изменить это или улучшить это. Вы можете предоставить логику для сброса и все.

1 голос
/ 07 мая 2011

Вы можете попробовать этот великолепный шедевр:

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 undefined) также сбросит настройки, а new log('Foobar'); добавит сообщение 'Foobar'. Но это было не в ваших тестовых случаях, поэтому я проигнорировал это.

Это также возможно:

(new log()).write('Message');
(new log())('Message');
(new log()).print(); // Prints empty log.
1 голос
/ 07 мая 2011
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();
0 голосов
/ 24 ноября 2011

Попробуйте взглянуть на структуру ведения журнала JSLog:

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...