这是一个很好的模式?
目标...
首先,我实现了Yahoo命名空间代码(注意,例如,我使用ROOT作为我的命名空间的根目录)...
if (typeof ROOT == "undefined" || !ROOT) {
var ROOT = {};
}
ROOT.namespace = function () {
var a = arguments,
o = null,
i, j, d;
for (i = 0; i < a.length; i = i + 1) {
d = ("" + a[i]).split(".");
o = ROOT;
for (j = (d[0] == "ROOT") ? 1 : 0; j < d.length; j = j + 1) {
o[d[j]] = o[d[j]] || {};
o = o[d[j]];
}
}
return o;
}
现在我声明我的第一个命名空间...
ROOT.namespace("UI");
ROOT.UI = {
utc: 12345,
getUtc: function() {
return this.utc;
}
}
我想在这里做的是保存我需要的用户界面的变量(在本例中是UTC的当前时间),以便它们不在全局对象上。 我也想提供一些特定的功能。 这应该在没有任何实例的每个页面上可用...
现在我想要在我的命名空间结构中存储一个对象。 但是,该对象需要多次创建。 这里的目标是将其保留在我的结构中,但允许它根据需要创建多次。 这如下所示:
ROOT.namespace("AirportFinder");
ROOT.AirportFinder = function(){
this.var1 = 99999;
this.Display = function() {
alert(this.var1);
}
}
这是实例化对象的示例代码...
var test1 = new ROOT.AirportFinder();
test1.Display();
这是一个很好的模式?
在命名空间ROOT
或类似的东西上定义事物确实是合理的。
使用闭包也更好
(function() {
var AirportFinder = function() {
this.var1 = 99999;
this.Display = function() {
alert(this.var1);
}
};
// do Stuff with local AirportFinder here.
// If neccesary hoist to global namespace
ROOT.AirportFinder = AirportFinder;
}());
如果他们不需要是全球性的。 我自己使用别名( $.foobar
因为jQuery是全局的),用于存储任何全局数据。
恐怕我不能告诉你.namespace
函数的作用。 这并不是真正必要的。
我个人的偏好是总是使用闭包创建一个私有名称空间,并将任何东西提升到需要的全局/共享名称空间。 这将全局可见性/集群降至最低。
稍微指点一下你的问题的路径:看看YUI3(http://developer.yahoo.com/yui/3/) - 你没有(有) 任何东西全球名称空间,你会得到一个私人沙箱。 伟大的概念,我喜欢那个图书馆和它的概念(YUI3,不是在谈论老YUI2)。 它的做法当然很简单,你也可以这样做:YUI3的动态模块加载器加载你的模块(.js文件),创建一个沙箱(只是一个闭包)并调用你的回调,给它一个处理沙盒。 任何地方的其他代码都无法访问该沙箱和您自己的名字。 在沙箱内,你可以(也应该)继续使用各种封装模式。 这个YUI3概念非常适合与外国代码混搭,尤其是当混搭变得更具动态性(例如用户触发)时,而不是仅仅由程序员自己集成Google Maps或其他众所周知的API。
我试图做一件类似的事情:
var namespace = function(str, root) {
var chunks = str.split('.');
if(!root)
root = window;
var current = root;
for(var i = 0; i < chunks.length; i++) {
if (!current.hasOwnProperty(chunks[i]))
current[chunks[i]] = {};
current = current[chunks[i]];
}
return current;
};
// ----- USAGE ------
namespace('ivar.util.array');
ivar.util.array.foo = 'bar';
alert(ivar.util.array.foo);
namespace('string', ivar.util);
ivar.util.string.foo = 'baz';
alert(ivar.util.string.foo);
试试看:http://jsfiddle.net/stamat/Kb5xY/
博客文章:http://stamat.wordpress.com/2013/04/12/javascript-elegant-namespace-declaration/
链接地址: http://www.djcxy.com/p/95301.html