0

色、名前などの異なるプロパティを持つ、さまざまなレベル (デバッグ、情報、警告など) のカスタム ロガーのプロトタイプを作成しようとしています。

私がやろうとしているのは、これらすべてのレベルを動的に構築し、すべてのプロパティを格納する Hashmap から取得することです。たとえば、、、などのカスタム ロガー オブジェクトがlogger.debug('test')ありlogger.info('text)ます。あなたはアイデアを得る。

しかし、私はこの特定のコードに問題があります:

var MyLogger = function(opts) {
    this.level = opts.level || 0
    this.loggers = {}

    var self = this

    for (l in LEVELS) {
        this.addLogger(l, new loggerOutput(LEVELS[l]))
        this[l] = function(message) {
            self.getLogger(l).output(message)
        }
    }
}

問題はself.getLogger(l)にあります。これは常に最後のロガー (エラー) を指しているためです。変数を静的文字列に置き換えると機能します: self.getLogger('info')

回避策は、すべてのロガーを手動でプロトタイプ化することです。明らかにそれは機能しますが、より良い解決策を見つけることを期待していました。

MyLogger.prototype = {
    debug: function(message) {
        this.getLogger('debug').output(message)
    },
    info: function(message) {
        this.getLogger('info').output(message)
    }
        ...
}

前もって感謝します。

4

1 に答える 1

1

プロトタイプ ソリューションを使用しますが、現在の「レベル」を関数ファクトリに渡すことにより、ループ内で関数を割り当てます。

for (var L in LEVELS)
    MyLogger.prototype[L] = loggerMaker(L)

function loggerMaker(l) {
    return function(message) {
        this.getLogger(l).output(message)
    };
}

Lここでは、関数を使用して、ループ内の現在を参照する新しい変数スコープを作成しました。

最新の JavaScript 環境のみをコーディングする場合は、オブジェクトの代わりに配列を使用してレベルを保持forEachし、匿名関数で使用します。

;['debug','info','warn'].forEach(function(L) {
    MyLogger.prototype[L] = function(message) {
        this.getLogger(L).output(message);
    };
});
于 2012-05-25T14:11:21.480 に答える