2

我一直在阅读人力车图表库的源代码,发现了这个片段:

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了。

这是好习惯吗,普遍吗?

4

2 回答 2

2

你是正确的Rickshaw.Graphnamespace函数调用是不必要的。然而namespace,这类函数对于更深的命名空间 ( Rickshaw.Graph.Foo.Bar) 很有用,其中定义的代码Rickshaw.Graph.Foo可能尚未加载。

按照namespace惯例,对于较浅的命名空间仍然包含函数调用——它有助于防止错误,如果Rickshaw.Graph被重构为被调用Rickshaw.Display.Graph,那么进行更改的人将看到namespace调用并对其进行更新,而不必记住添加它。

对于您的最后一个问题(是否常见)-很难说。许多项目没有那么多不同的组件,以至于这些深层次的 Java 风格的命名空间是必要的。这个想法肯定不仅仅存在于 Rickshaw 中——例如,ExtJS 具有Ext.ns()相同的功能。

于 2013-06-24T19:04:57.517 回答
-1

Rickshaw.Something.AnotherThing将 TypeError 因为您还没有定义“某事”。

你需要做类似的事情

if (typeof Rickshow !== "undefined" && Rickshow !== null) {
  Rickshow;
} else {
  if (Rickshow.Something == null) {
   Rickshow.Something = {};
  }
};
Rickshow.Something.AnotherThing = {};

这个命名空间函数可能只是一个帮助,以防止你不得不编写上述内容。

于 2013-06-24T19:15:06.447 回答