从不同文件向JavaScript命名空间添加多个实体

时间:2010-06-02 17:53:24

标签: javascript design-patterns singleton namespaces

给定两个不同文件中使用的名称空间ns

abc.js

ns = ns || (function () {
   foo = function() { ... };

   return {
      abc : foo
   };
}());

def.js

// is this correct?
ns = ns || {}

ns.def = ns.def || (function () {
   defoo = function () { ... };
   return {
      deFoo: defoo
   };
}());

这是将def添加到ns命名空间的正确方法吗?换句话说,如何在javascript中合并两个对命名空间的贡献?

如果abc.js出现在def.js之前,我希望这可行。如果def.js出现在abc.js之前,我希望ns.abc不存在,因为当时定义了ns

似乎应该有一个设计模式来消除使用javascript命名空间模式进行包含的任何不确定性。

我很欣赏有关如何最好地利用这种“包容性”的想法和意见。

感谢阅读。

布赖恩

2 个答案:

答案 0 :(得分:8)

这肯定有用。但请记住,源顺序会影响您的实现:如果在abc.js之前包含def.js,则永远不会执行foo和ns.abc的定义。

看看YUI's old namespace function for an example:他们确保使用现有对象或新对象初始化,可能是出于上述原因。

它可能很好地帮助您将模块与以下内容分开:

ns = ns || {};
ns.abc = function(){ ... }();

and 

ns = ns || {};
ns.def = function() ... }();

这样,每个都是一个单独的模块,源顺序无关紧要,并且每个模块都可以访问自己的闭包,就像在示例中一样。

答案 1 :(得分:2)

感兴趣的是,我发现AMDRequireJS并开始使用它。