2015-05-27 54 views
0

我想避免冗餘代碼爲我的項目之一,這是一個simple logger。這個記錄器需要* .alert,* .notice等功能,我也決定給它們分配別名(.alert = .al等)。將多個相似的函數附加到原型

這導致了多個相似的功能,只有一個數字和名稱不同。

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

作爲一種嘗試,以使該代碼庫少冗餘我創造了這個「創作者功能」:

// 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棉短絨告訴我,new Function()eval()一種形式。有沒有其他更好的方法來解決這個問題?

回答

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')

+2

不應該是'level + 1'嗎? – Bergi

+0

是的,它實際上應該。我只是改變了我現在使用的解決方案。 – Dodekeract

2

你或許可以取代

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

通過

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

不幸的是日在不起作用。它拋出'Object沒有方法applyLogLevel'。似乎在原型/課堂之外運作。 – Dodekeract

+0

你可以試試新版本嗎? ;我錯誤地處理了第一個版本的範圍。 –

+0

最後的編輯很好地工作。 – Dodekeract

相關問題