如何将同一个闭包下的对象分隔到不同的文件中

yil*_*yin 6 javascript closures

我的客户有以下结构;

var myObject = (function(){
    var mainObjectList = [];
    var globalObject = {
            init:function(mainObjectId){
                var logger = {};
                var utilityObject1 = {};
                var utilityObject2 = {};
                var mainObject = {};
                mainObjectList.push(mainObject);
            },//init
            someOtherMethods:function(){}
        };//globalObject
    return globalObject;
})();
Run Code Online (Sandbox Code Playgroud)

和我的客户我可以说myObject.init(5); 并创建一个新的结构.我的问题是我在init函数闭包中有很多实用程序对象(logger,utilityObject1,utilityObject2 ..).我的总文件超过了1000行,所以我想将所有实用程序对象分成不同的文件以获得更好的项目.例如,我可以将logger,utilityObject1,utilityObject2分离到自己的文件中.问题是因为对象处于闭包状态,我不能只将它们添加到单独文件中的主对象中.所以我想到了以下注射方法.

//start of file1
var myObject = (function(){
    var mainObjectList = [];
    var globalObject = {
            init:function(mainObjectId){
                var logger;
                var utilityObject1 = {};
                var utilityObject2 = {};
                var mainObject = {};
                mainObjectList.push(mainObject);
            },//init
            someOtherMethods:function(){},
            injectLogger:function(creator){
                this.logger = creator();
            }
        };//globalObject
    return globalObject;
})();
//start of file2
myObject.injectLogger(function(){return {};});
Run Code Online (Sandbox Code Playgroud)

这样我就可以分开我的文件进行开发了.但在生产中我可以连接文件以拥有一个文件.但是这个设计有些问题.我刚刚在myObject中添加了一个可访问的injectLogger函数.并且我的记录器现在不能在闭包中使用其他局部变量(我现在必须将它们传递给creator对象).我的问题是有没有其他方法将这种代码分成文件.(也许是一个外部工具.)

nem*_*ost 2

我喜欢使用谷歌的闭包编译器http://code.google.com/closure/compiler/

如果你不想使用类似的东西,你可以尝试这样的事情:(确保你首先加载 globalObject.js 来定义变量)。

//globalObject.js
var globalObject = function() {

}

//init.js
globalObject.prototype.init = function() {
    this.utilityFunction();
    //do something with utilityObject1
    this.utilityFunction(this.utilityObject1);
}

//utilityFunction.js
globalObject.prototype.utilityFunction= function() {}

//utilityObject1.js
globalObject.prototype.utilityObject1 = {};

//main.js
var myObject = new globalObject();
myObject.init();
Run Code Online (Sandbox Code Playgroud)

然后您可以通过执行以下操作来覆盖该函数:

//main.js
var myObject = new globalObject();
myObject.utilityFunction = function() {
    //new function
}
myObject.init(); // This will then use the new utilityFunction method you just set.
Run Code Online (Sandbox Code Playgroud)