如何在JavaScript中为命名空间提供实例对象

时间:2020-03-05 18:42:09  来源:igfitidea点击:

我有一个以这种方式构建的JavaScript"对象":

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

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

...

我知道如何用单例JavaScript对象模拟名称空间,但是"命名"对象(例如上面提到的对象)的最佳方法是什么?

我知道几个JavaScript库都具有命名空间功能,但是我使用的是jQuery,并且宁愿不添加其他库。我希望能够通过使用jQuery为需要实例化的我的JS对象提供内部命名间隔方案来提供自己的名称。

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

回答

这两个答案都非常有帮助!我最终得到的是:

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