Bri*_*unt 11 javascript singleton design-patterns namespaces
给定ns两个不同文件中使用的命名空间:
ns = ns || (function () {
foo = function() { ... };
return {
abc : foo
};
}());
Run Code Online (Sandbox Code Playgroud)
// is this correct?
ns = ns || {}
ns.def = ns.def || (function () {
defoo = function () { ... };
return {
deFoo: defoo
};
}());
Run Code Online (Sandbox Code Playgroud)
这是添加def到ns命名空间的正确方法吗?换句话说,如何在javascript中合并两个对命名空间的贡献?
如果abc.js在def.js我希望这个工作之前到来.如果def.js在abc.js我预期ns.abc不存在之前,因为ns当时已定义.
似乎应该有一个设计模式来消除使用javascript命名空间模式进行包含的任何不确定性.
我很欣赏有关如何最好地利用这种"包容性"的想法和意见.
谢谢阅读.
布赖恩
那当然会奏效.但请记住,源顺序会影响您的实现:如果在abc.js之前包含def.js,则永远不会执行foo和ns.abc的定义.
看一下YUI的旧命名空间函数的例子:它们确保使用现有对象或新对象初始化,可能是出于上述原因.
它可能会帮助您将模块与以下内容分开:
ns = ns || {};
ns.abc = function(){ ... }();
and
ns = ns || {};
ns.def = function() ... }();
Run Code Online (Sandbox Code Playgroud)
这样,每个都是一个单独的模块,源顺序无关紧要,并且每个模块都可以访问自己的闭包,就像在您的示例中一样.