0

私は現在、ユーザーが loadModules() 関数を介してモジュールをロードできるようにする API を作成しています (一種のプラグイン機能を提供するため)。

完全なコード:

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 に答える