0

我有一个命名空间:Foo.Bar.Baz在其中我有Qux类。这些是使用显示模块模式定义的:

Foo.Bar.Baz = (function ($) {  // the namespace/module

  function Qux() {             // the Qux "class" is contained in this namespace
  // ...
  }

  Qux.prototype.doStuff = function() {
  // ...
  }

  return {                     // public exports from this namespace
    Qux: Qux
  };

}(jQuery));

现在,在一个单独的文件中,我想将该Quux类添加到这个命名空间。我怎么做?当我使用与上面相同的模式时,它会被忽略,因为我猜一个正在覆盖另一个。

4

2 回答 2

1

想通了:正如预期的那样,第二个文件的模块在加载后立即覆盖第一个。

在每个文件中,使用以下结构:

Foo.Bar.Baz = (function (module, $) { // redefine existing module

  function Qux() {                    // add Qux "class" to it
  // ...
  }


  var exports = {                     // revealing module pattern: define exports
    Qux: Qux,
    // etc.
  };
  $.extend(module, exports);          // merge modules
  return module;

}(Foo.Bar.Baz, jQuery));              // import existing module, and anything else

对其他文件使用相同的结构(包含相同的模块但具有不同的类)。先定义哪个并不重要。

于 2013-03-14T00:01:20.200 回答
1

由于您已经为 分配了一个对象Baz,您只需要创建一个新属性:

Foo.Bar.Baz.Quux = (function() {
    function private() {}
    var privateVar = 'whatever';

    return function() {
        // access private and privateVar
    };
}());

当然,Quux 无法访问 Qux 的私有成员,这是问题所在吗?

编辑

如果要传入对象引用,可以执行以下操作:

(function(module) {
    function private() {}
    var privateVar = 'whatever';

    module.Qux = function() {
      // whatever
    };

    module.Quux = function() {
      // different whatever
    };
}(Foo.Bar.Baz));

这两种方法在功能上是等效的。

于 2013-03-13T23:53:06.053 回答