如何在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() );