我正在实现Stoyan Stefanov的javascript命名空间函数,因为我一直在阅读他非常丰富的JavaScript Patterns书;在我的网络应用程序中但不确定我是否正确使用它
这是我在此网页上的网页应用中使用的功能实现http://dalydd.com/projects/module_example/
var COOP = COOP || {};
COOP.namespace = function (ns_string) {
var parts = ns_string.split('.'),
parent = COOP,
i;
// strip redundant leading global
if (parts[0] === "COOP") {
parts = parts.slice(1);
}
for (i = 0; i < parts.length; i += 1) {
// create a property if it doesn't exist
if (typeof parent[parts[i]] === "undefined") {
parent[parts[i]] = {};
}
parent = parent[parts[i]];
}
return parent;
};
COOP.namespace('sliderContainer')
COOP.sliderContainer = function () {
return slider = ($('#slider').length > 0) ? $('#slider') : $('#element_temp');
} // we need this at the beginning as others are dependent on it and call it initially
我的目标是检查COOP的每个新属性,看它是否在它实现之前存在 - 所以如果我创建一个名为COOP.sliderContainer的COOP属性 - 我想确保COOP.sliderContainer不存在。当我使用命名空间函数时,它返回一个对象,但COOP.sliderContainer是一个函数。我觉得我必须做一个额外的抽象层,以便命名这个命名空间函数正常工作,如
var sliderContainer = COOP.namespace('sliderContainer');
sliderContainer.sliderContainer = function () {
return slider = ($('#slider').length > 0) ? $('#slider') : $('#element_temp');
}
这对我来说似乎很愚蠢和多余 - 有更好的方法吗?
任何信息都会一如既往地受到赞赏 - 该页面上有直接指向js文件的链接
答案 0 :(得分:1)
命名空间函数非常有用,它有助于避免多次检查。例如,您想要创建 COOP.module.module1 ,您必须进行2次检查以查看模块和模块1是否未定义。
但是,在这种情况下,sliderContainer只是COOP的一个属性。没有必要使用命名空间。你只需自己检查一下:
if(COOP.sliderContainer === undefined){
// define it
}
修改强>
您可以拥有适合您的功能处理:
COOP.createProperty = function(name, prop){
if(COOP[name] === undefined){
COOP[name] = prop;
}
}
然后
COOP.createProperty("sliderContainer", function(){
// do whatever you want
});