如何正确声明命名空间?我刚读完《开发大型 Web 应用程序》,作者建议使用以下方式:
if (!window.YourNamespace) {
YourNamespace = {};
}
看起来很简单..但是我看到所有的JavaScript库都用于声明命名空间和替代方法。有没有标准的方法来做这个?上面的代码有什么问题吗?
如何正确声明命名空间?我刚读完《开发大型 Web 应用程序》,作者建议使用以下方式:
if (!window.YourNamespace) {
YourNamespace = {};
}
看起来很简单..但是我看到所有的JavaScript库都用于声明命名空间和替代方法。有没有标准的方法来做这个?上面的代码有什么问题吗?
书籍作者提到的命名空间声明方式确实非常好。但是当你需要在多个文件中重复使用它并且命名空间有多个子命名空间时,这可能会变得相当繁琐:
if (!window.Foo) {
Foo = {};
}
if (!window.Foo.Bar) {
Foo.Bar = {};
}
if (!window.Foo.Bar.Baz) {
Foo.Bar.Baz = {};
}
etc...
相反,您应该编写一个简单的函数来为您声明名称空间:
function namespace(ns) {
var parts = ns.split(/\./);
var obj = window;
for (var i=0; i<parts.length; i++) {
var p = parts[i];
if (!obj[p]) {
obj[p] = {};
}
obj = obj[p];
}
}
namespace("Foo.Bar.Baz");
我在很多地方看到过这种惯例的使用。
window.YourNamespace = window.YourNamespace || {};
var Utils = {
namespace : function(name) {
return window[name] = window[name] || {};
}
};
或者如果你更喜欢你的方式使用:
if (typeof window.YourNamespace === 'undefined') {
YourNamespace = {};
}
在JavaScript中自动命名空间声明非常简单,如下所示:
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/
在不同的框架之间,没有标准的方法,但它们超越了基础知识,例如 X.Y.Z,如果它们不存在,它将创建该链中的所有对象。
bob.js 这样处理命名空间:
bob.ns.setNs('YourNamespace', {
/*define your members here. e.g.:*/
method1: function () { /*...*/ }
});
// now, merge another, sub-namespace.
bob.ns.setNs('YourNamespace.YourSubNamespace', {
method2 function () { /*...*/ }
});
//call methods:
YourNamespace.method1();
YourNamespace.YourSubNamespace.method2();
一些命名空间函数的示例:
namespace = function(ns){
arr = ns.split(".")
parent = window
var temp
while( ( temp = arr.shift()) !== undefined){
parent[temp] = parent[temp] || {}
parent = parent[temp]
}
}
然后您可以将其用作:
namespace("your.own.namespace")
your.own.namespace.Car= function () {
this.speed = 30;
}