提问人:rp. 提问时间:8/23/2008 最后编辑:Communityrp. 更新时间:4/21/2017 访问量:9923
如何在 JavaScript 中为命名空间提供实例化对象
How to provide namespaces in JavaScript with instanced objects
问:
我有一个JavaScript“对象”,是这样构建的:
function foo()
{
this.length = 0;
}
foo.prototype.getLength = function()
{
return this.length;
}
...
我知道如何使用单例 JavaScript 对象模拟命名空间,但是“命名”像上面这样的对象的最佳方法是什么?
我知道有几个 JavaScript 库具有命名步宽功能,但我使用的是 jQuery,并且宁愿不添加另一个库。我希望能够提供我自己的,也许是通过利用jQuery,为需要实例化的JS对象提供内部命名空间方案。
谢谢 RP的
答:
2赞
Nickolay
8/23/2008
#1
应该不会有太大的不同:
namespace.foo = function foo() {...}
namespace.foo.prototype.getLength = function() { ... }
或者你可以使用
(function() {
function foo() { ... }
foo.prototype...
namespace.foo = foo;
})();
以节省一些输入。
12赞
Jason Bunting
8/23/2008
#2
简单:
if(!MyNamespace) MyNamespace = {};
MyNamespace.foo = function() {
this.length = 0;
};
MyNamespace.foo.prototype.getLength = function() {
return this.length;
};
评论
0赞
Jason Bunting
11/11/2015
@Chameleon - 嗯?你在谈论什么?!“原型”是一个自动的属性,它本身不必被“创建”
8赞
Marius
8/23/2008
#3
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");
评论
0赞
harpo
9/9/2009
很好的提示 - 但我认为你想要冒号而不是分号在你的第一个例子中,不是吗?
2赞
rp.
8/23/2008
#4
两个答案都非常有帮助!这是我最终得到的:
if( typeof( rpNameSpace ) == "undefined" ) rpNameSpace = {};
rpNameSpace.foo = function() {
this.length = 613;
}
rpNameSpace.foo.prototype.getLength = function() {
return this.length * 2;
}
然后,要使用生成的“namespaced”对象,请执行以下操作:
var x = new rpNameSpace.foo()
display( x.getLength() );
-1赞
Tengiz
4/5/2013
#5
另一种选择可能是 bob.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');
评论