インスタンス化されたオブジェクトを使用して JavaScript で名前空間を提供する方法
-
09-06-2019 - |
質問
次のように構築された JavaScript の「オブジェクト」があります。
function foo()
{
this.length = 0;
}
foo.prototype.getLength = function()
{
return this.length;
}
...
シングルトン JavaScript オブジェクトを使用して名前空間をエミュレートする方法は知っていますが、インスタンス化される上記のようなオブジェクトを「名前空間」にする最良の方法は何ですか?
いくつかの JavaScript ライブラリに名前ペーシング機能があることは知っていますが、私は jQuery を使用しているので、これに別のライブラリを追加したくありません。おそらく jQuery を利用して、インスタンス化する必要がある JS オブジェクトに独自の固有の名前空間スキームを提供できるようにしたいと考えています。
RPに感謝します
解決
単純:
if(!MyNamespace) MyNamespace = {};
MyNamespace.foo = function() {
this.length = 0;
};
MyNamespace.foo.prototype.getLength = function() {
return this.length;
};
他のヒント
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");
あまり変わらないはずです:
namespace.foo = function foo() {...}
namespace.foo.prototype.getLength = function() { ... }
または、使用できます
(function() {
function foo() { ... }
foo.prototype...
namespace.foo = foo;
})();
入力の手間を省くためです。
どちらの回答もとても役に立ちました!私が最終的に得たものは次のとおりです。
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() );
別の代替案としては、 ボブ.js フレームワーク:
bob.ns.setNs('myApp.myFunctions', {
say: function(msg) {
console.log(msg);
}
});
//sub-namespace
bob.ns.setNs('myApp.myFunctions.mySubFunctions', {
hello: function(name) {
myApp.myFunctions.say('Hello, ' + name);
}
});
//call:
myApp.myFunctions.mySubFunctions.hello('Bob');
所属していません StackOverflow