有没有办法定义全局命名空间,以便我可以从我的所有页面调用此命名空间中的函数?
例如
//在一个文件中我定义下面的代码
DefineNameSpace("my.namespace.api", {
addObject: function(obj) {
// store obj into indexDB
},
readAllObject: function() {
// return array of object from indexdb
}
})
//这样我可以在另一个javascript文件中
my.namespace.api.addObject({name: "foo", desc: "bar"});
有没有办法实现" DefineNameSpace"方法
由于
答案 0 :(得分:3)
这样做的一种方法很简单,就是:
my = {
namespace: {
api : {}
}
}
my.namespace.api.addObject = function (obj) { }
你实际上是在创建对象,但这样它也可以作为名称空间使用:)
这不是你正在实施的方法。但是使用方法构建命名空间需要在加载脚本文件之前调用函数,其中使用命名空间,否则在调用DefineNamespace方法之前调用这些代码行,并且您将遇到部分名称空间在那一点上是不确定的。上面的解决方案并非如此,但不幸的是它不是动态的。
答案 1 :(得分:1)
动态构建命名空间可以通过以下方式完成:
// the root of the namespace would still be handy to have declared here
var my = {};
function defineNamespace(namespaceStr) {
var namespaceSegments = namespaceStr.split(".");
var namespaceSoFar = null;
// iterate through namespace parts
for (var i = 0; i < namespaceSegments.length; i++) {
var segment = namespaceSegments[i];
if (i == 0) {
// if namespace starts with my, use that
if (segment == "my") {
// set pointer to my
namespaceSoFar = my;
}
else {
// create new root namespace (not tested this, but think this should work)
var otherNamespace = eval(segment);
if (typeof otherNamespace == "undefined") {
eval(segment + " = {};");
}
// set pointer to created root namespace
namespaceSoFar = eval(segment);
}
}
else {
// further build the namespace
if (typeof namespaceSoFar[segment] == "undefined") {
namespaceSoFar[segment] = {};
}
// update the pointer (my -> my.namespace) for use in the next iteration
namespaceSoFar = namespaceSoFar[segment];
}
}
}