我目前正在编写一个API,允许用户通过loadModules()函数加载模块(以提供一种插件功能):
完整代码:
var LC = (function(){
var alertModule = {
alertName: function(name) {
alert(name);
},
alertDate: function() {
alert(new Date().toUTCString());
}
}
var logModule = {
logName: function(name) {
console.log(name);
},
logDate: function() {
console.log(new Date().toUTCString());
}
}
return {
loadModules: function(moduleList) {
for(var i=0, l=moduleList.length; i<l; i++) {
try {
this[moduleList[i]] = eval(moduleList[i]);
} catch(e) {
throw("Module does not exist");
}
}
}
}
})();
LC.loadModules(['alertModules', 'logModule']);
下面的代码会将alertModule和logModule对象添加到LC对象。
LC.loadModules(['alertModule', 'logModule']);
在loadModules方法中,我循环遍历数组并使用以下代码将对象添加到LC:
this[moduleList[i]] = eval(moduleList[i]);
这很好用,我很确定它是安全的(如果模块不存在则抛出错误)但是有更优雅的方法吗?我能想到的另一种方法是将模块本身放在一个对象中,这样我就可以更容易地引用它们。欢迎任何其他想法/想法!
答案 0 :(得分:1)
试试这个:http://jsfiddle.net/PUgM7/2/
不是使用eval()
引用那些“私有”变量,而是可以使用模块散列。
var modules = {
alertModule: { .. },
logModule: { ... },
}
您可以对此进行扩展并添加额外的功能,例如使用其他公共方法动态注册模块,例如addModule
。
return {
addModule: function(name, newModule) {
modules[name] = newModule;
},
loadModules: function() { ... }
}