Javascript 如何在循环中创建一组动态函数的原型?

Javascript 如何在循环中创建一组动态函数的原型?,javascript,closures,Javascript,Closures,我正在尝试使用不同级别(调试、信息、警告…)的定制记录器原型,每个级别都有不同的属性,如颜色、名称等 我试图做的是动态构建所有这些级别,从存储所有属性的Hashmap中获取它们。 例如,我有一个带有logger.debug('test'),logger.info('text),等等的自定义记录器对象。你明白了 但是,我对这个特定的代码有问题: var MyLogger = function(opts) { this.level = opts.level || 0 this.log

我正在尝试使用不同级别(调试、信息、警告…)的定制记录器原型,每个级别都有不同的属性,如颜色、名称等

我试图做的是动态构建所有这些级别,从存储所有属性的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)
    }
        ...
}

提前感谢。

使用原型解决方案,但通过将当前“级别”传递给函数工厂来分配循环中的函数

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);
    };
});

您的循环中有一个闭包: