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

にオブジェクトをすでに割り当てているので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));

2つのアプローチは機能的に同等です。

于 2013-03-13T23:53:06.053 に答える
1

それを理解しました:予想通り、2番目のファイルのモジュールはロードされるとすぐに最初のファイルを上書きしていました。

各ファイルで、次の構造を使用します。

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 に答える