11

私はJavaScriptの「オブジェクト」を持っています。これは次のように構築されています。

function foo()
{
    this.length = 0;
}

foo.prototype.getLength = function()
{
    return this.length;
}

...

シングルトンJavaScriptオブジェクトを使用して名前空間をエミュレートする方法を知っていますが、上記のようなオブジェクトを「ネームスペース」するための最良の方法は何ですか?

いくつかのJavaScriptライブラリに名前空間機能があることは知っていますが、私はjQueryを使用しており、別のライブラリをミックスに追加したくありません。インスタンス化する必要のある私のJSオブジェクトの固有の名前空間スキームであるjQueryを利用することで、独自の名前空間を提供できるようにしたいと思います。

ありがとうrp

4

5 に答える 5

12

単純:

if(!MyNamespace) MyNamespace = {};

MyNamespace.foo = function() {
   this.length = 0;
};
MyNamespace.foo.prototype.getLength = function() {
   return this.length;
};
于 2008-08-22T18:18:30.947 に答える
8

Javascriptには、他の言語のような名前空間やパッケージは実際にはありません。代わりにクロージャがあります。複数の関数、変数、およびオブジェクトで構成されるアプリケーションがある場合は、それらを単一のグローバルオブジェクト内に配置する必要があります。これは、名前空間と同じ効果があります。

例えば:

var namespace = {
  this.foo: function(){
    ...
  },
  this.foo.prototype.getLength: function(){
    ...
  }
}

ネストされたオブジェクトのセットを作成し、パッケージをシミュレートすることもできます。

loadPackage = function(){
  var path = arguments[0];
  for(var i=1; i<arguments.length; i++){
    if(!path[arguments[i]]){
      path[arguments[i]] = {};
    }
    path = path[arguments[i]];
  }
  return path;
}

loadPackage(this, "com", "google", "mail") = {
  username: "gundersen",
  login: function(password){
    ...
  }
}
this.com.google.mail.login("mySecretPassword");
于 2008-08-22T19:03:43.320 に答える
2

それほど変わらないはずです:

namespace.foo = function foo() {...}
namespace.foo.prototype.getLength = function() { ... }

またはあなたが使用することができます

(function() {
  function foo() { ... }
  foo.prototype...
  namespace.foo = foo;
})();

タイピングを節約します。

于 2008-08-22T17:41:59.380 に答える
2

どちらの回答もとても参考になりました!これが私が最終的に得たものです:

if( typeof( rpNameSpace ) == "undefined" ) rpNameSpace = {};

rpNameSpace.foo = function() {
    this.length = 613;
}
rpNameSpace.foo.prototype.getLength = function() {
    return this.length * 2;
}

次に、結果の「名前空間」オブジェクトを使用するには、次のようにします。

var x = new rpNameSpace.foo()

display( x.getLength() );
于 2008-08-22T20:56:44.997 に答える