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

如何在JavaScript中使用实例对象提供名称空间,javascript,namespaces,Javascript,Namespaces,我有一个JavaScript“对象”,是这样构建的: function foo() { this.length = 0; } foo.prototype.getLength = function() { return this.length; } ... 我知道如何用单例JavaScript对象来模拟名称空间,但是对上面这样的对象进行“名称空间”的最佳方式是什么 我知道有几个JavaScript库具有名称调整功能,但我使用的是jQuery,不希望在混合中添加其他库。我希望能

我有一个JavaScript“对象”,是这样构建的:

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

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

...
我知道如何用单例JavaScript对象来模拟名称空间,但是对上面这样的对象进行“名称空间”的最佳方式是什么

我知道有几个JavaScript库具有名称调整功能,但我使用的是jQuery,不希望在混合中添加其他库。我希望能够为我需要实例化的JS对象提供我自己的名称空间方案,也许可以利用jQuery

谢谢
rp不应该有太大的不同:

namespace.foo = function foo() {...}
namespace.foo.prototype.getLength = function() { ... }
或者你可以用

(function() {
  function foo() { ... }
  foo.prototype...
  namespace.foo = foo;
})();
保存一些输入。

简单:

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");
loadPackage=function(){
变量路径=参数[0];

对于(var i=1;i两个答案都非常有用!以下是我的结论:

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

rpNameSpace.foo = function() {
    this.length = 613;
}
rpNameSpace.foo.prototype.getLength = function() {
    return this.length * 2;
}
然后,要使用生成的“名称空间”对象:


另一种选择可能是框架:

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

很好的提示——但我认为你在第一个例子中需要冒号而不是分号,不是吗?@Chameleon-huh?你在说什么?!“原型”是自动生成的属性,它本身不必“创建”
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');