0

我目前正在编写一个 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]);

这工作正常,我相当确定它是安全的(如果模块不存在,则会引发错误),但是有没有更优雅的方式来做到这一点?我能想到的唯一另一种方法是将模块本身放在一个对象中,这样我就可以更容易地引用它们。欢迎任何其他想法/想法!

4

1 回答 1

1

试试这个:http: //jsfiddle.net/PUgM7/2/

除了引用这些“私有”变量之外,eval()您还可以拥有一个模块哈希。

var modules = {
  alertModule: { .. },
  logModule: { ... },
}

您可以对此进行扩展并添加额外的功能,例如使用另一种公共方法动态注册模块,例如addModule.

return {
  addModule: function(name, newModule) {
    modules[name] = newModule;
  },
  loadModules: function() { ... } 
}
于 2013-03-15T10:52:45.110 回答