我一直在阅读人力车图表库的源代码,我找到了这个片段:
var Rickshaw = {
namespace: function(namespace, obj) {
var parts = namespace.split('.');
var parent = Rickshaw;
for(var i = 1, length = parts.length; i < length; i++) {
var currentPart = parts[i];
parent[currentPart] = parent[currentPart] || {};
parent = parent[currentPart];
}
return parent;
},
...
现在我明白这是命名空间的对象文字符号。
稍后,当定义单个“模块”时,将使用以下语法:
Rickshaw.namespace('Rickshaw.Graph');
Rickshaw.Graph = function(args) {
...
有人可以向我解释这里发生了什么。为什么他们在撰写以下内容时需要namespace
函数是完全合法的?:
Rickshaw.Graph = function(args) {
...
如果我不得不采取一个平底船,我猜这是我们可以定义类似的东西:
Rickshaw.Something.AnotherThing
无需担心我们是否已定义Rickshaw.Something
。
这是一种很好的做法吗,这是常见的吗?
答案 0 :(得分:2)
对于Rickshaw.Graph
,您是正确的,namespace
函数调用是不必要的。但是,此类namespace
函数对于更深层的命名空间(Rickshaw.Graph.Foo.Bar
)非常有用,其中定义Rickshaw.Graph.Foo
的代码可能尚未加载。
按惯例,仍然为较浅的命名空间包含namespace
函数调用 - 它有助于防止出现错误,如果Rickshaw.Graph
被重构为被调用Rickshaw.Display.Graph
,那么更改将看到namespace
调用并更新它,而不必记住添加它。
对于你的最后一个问题(这是常见的) - 很难说。许多项目没有那么多不同的组件,这些深层的Java风格的命名空间是必需的。这个想法绝对不仅仅存在于人力车中 - 例如ExtJS有Ext.ns()
也可以做同样的事情。
答案 1 :(得分:-1)
Rickshaw.Something.AnotherThing
会因为你还没有定义'Something'而导致TypeError。
你需要做类似
的事情if (typeof Rickshow !== "undefined" && Rickshow !== null) {
Rickshow;
} else {
if (Rickshow.Something == null) {
Rickshow.Something = {};
}
};
Rickshow.Something.AnotherThing = {};
这个命名空间函数可能只是帮助你不必编写上述内容。