将多个类似的函数附加到protoype

时间:2015-05-27 15:14:07

标签: javascript node.js eval

我想避免我的某个项目的冗余代码,即simple logger。这个记录器需要* .alert,* .notice等函数。我还决定为它们分配别名(.alert = .al等)。

这导致了多个类似的功能,只有一个数字和名称相同。

Module.protoype.emergency = Module.prototype.em = function () {
    this.applyLogLevel(' + (i+1) + ', arguments);
}

为了减少代码库的冗余,我创建了这个“creator-function”:

// create logging functions
var prototypeNames = [
    ['emergency', 'emer', 'mrgc', 'em'],
    ['alert', 'aler', 'alrt', 'al'],
    ['critical', 'crit', 'crtc', 'cr'],
    ['error', 'erro', 'rror', 'er'],
    ['warning', 'warn', 'wrng', 'wa'],
    ['notice', 'noti', 'notc', 'no'],
    ['info', 'in'],
    ['debug', 'debu', 'dbug', 'de']
];

for (var i = 0; i < prototypeNames.length; i++) {
    for (var j = 0; j < prototypeNames[i].length; j++) {
        Module.prototype[prototypeNames[i][j]] = Module.prototype.Namespace.prototype[prototypeNames[i][j]] = new Function ('this.applyLogLevel(' + (i+1) + ', arguments);');
    }
}

现在我的Javascript linter告诉我new Function()eval()的一种形式。有没有其他/更好的方法来解决这个问题?

2 个答案:

答案 0 :(得分:2)

你可以替换

new Function ('this.applyLogLevel(' + (i+1) + ', arguments);');

通过

(function(level) {
     return function() {
               this.applyLogLevel(level, arguments);
             }
     })(i+1);

答案 1 :(得分:1)

我想这就是你要找的东西:

var prototypeNames = [
    ['emergency', 'emer', 'mrgc', 'em'],
    ['alert', 'aler', 'alrt', 'al'],
    ['critical', 'crit', 'crtc', 'cr'],
    ['error', 'erro', 'rror', 'er'],
    ['warning', 'warn', 'wrng', 'wa'],
    ['notice', 'noti', 'notc', 'no'],
    ['info', 'in'],
    ['debug', 'debu', 'dbug', 'de']
];

var Logger = {

    applyLogLevel: function(level, args) {
        document.write('log ' + level + ' ' + args[0] + '<br>');
    }

};

prototypeNames.forEach(function(names, level) {
    var fn = function() {
        this.applyLogLevel(level, arguments);
    };
    names.forEach(function(n) {
        Logger[n] = fn;
    });
});

Logger.emergency('oops')
Logger.warn('take care')
Logger.dbug('stop')