Javascript模块模式帮助

时间:2011-07-28 08:03:20

标签: javascript module design-patterns javascript-framework

我遇到的问题是一个文件中有一组变量值/属性,另一个文件中有一个库。我已经开始重构代码,但仍需要保持变量值(动态)和库(静态)不同。

我正在使用命名空间,并且总体上只需要一个全局命名空间。

我目前遇到的问题: 1.我怎样才能保留一个全局命名空间 2.从一个文件中读取值并在另一个文件中存在的库中使用它的最佳方法是什么。

例如,我提出了像

这样的东西
//File ONE with values 
var main.dynamicvalues = (function(){ 
    var a = 10,
    b = 20,
    c = 30;
    return {
        a:a,
        b:b,
        c:c
    }
}());


//File TWO with core Library
var main.library = (function(){ 
    //Various Private functions that need to use a,b,c variables from above main.dynamicvalues namespace

    return {
        //Public functions again need to use a,b,c from above namespace.
    }
}());

有没有一种方法我可以拥有一个模式,这样我只保留一个全局命名空间,并且可以直接引用变量而无需使用maincode.values.a,maincode.values.b,maincode.values.c或类似的东西这在maincode.library.functions

由于 Sparsh Gupta

3 个答案:

答案 0 :(得分:2)

这种方法稍微好一点,但它并不完全是你想要的。

var main = {};

main.dynamicvalues = (function() {
 // same as before
})();


main.library = (function(dyn){   
        // use dyn.a, dyn.b etc

        return {

            // same in here
        }
    }(main.dynamicvalues));

答案 1 :(得分:1)

创建一个新文件(可能将其命名为“common.js”)并将值放在那里。

答案 2 :(得分:0)

您可以尝试RequireJS。这将让你完全没有全局命名空间(如果你愿意的话)。此外,它还将为您提供非阻塞脚本加载,简单的方法来处理依赖项和构建工具。

另一方面,它可以剥夺你为自己调查事物的乐趣,并更好地理解js架构模式。

使用RequireJs的代码可能如下所示:

// File one with values, let's name it values.js
define([], function() {
    var a = 10,
        b = 20,
        c = 30;
    return {
        a: a,
        b: b,
        c: c
    }

})

// File two with library
define([
    // load values.js as a dependency
    'values'
    // what is returned in values.js can be passed as an argument to the callback
    ], function( values ) {
    values.a === 10 // true
})