如何在JavaScript中使用实例化对象提供命名空间

11
我有一个JavaScript“对象”,是这样构建的:
function foo()
{
    this.length = 0;
}

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

...

我知道如何使用单例JavaScript对象模拟命名空间,但是如果要实例化像上面那样的对象,“命名空间”的最佳方法是什么?
我知道许多JavaScript库都具有命名空间功能,但我正在使用jQuery,不想将另一个库添加到混合中。我希望能够提供自己的命名空间,也许是利用jQuery为需要实例化的JS对象的内在命名空间方案。
谢谢 rp
5个回答

12

简单:

if(!MyNamespace) MyNamespace = {};

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

@Chameleon - 嗯?你在说什么?!“原型”是一个自动生成的属性,不必要“创建”它。 - Jason Bunting

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");

好的提示--但是我认为在你的第一个例子中应该使用冒号而不是分号,对吗? - harpo

2
不应该有太大的不同:
namespace.foo = function foo() {...}
namespace.foo.prototype.getLength = function() { ... }

或者您可以使用
(function() {
  function foo() { ... }
  foo.prototype...
  namespace.foo = foo;
})();

为了节省输入,请使用一些简写。


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() );

-1

另一个选择可能是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'); 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接