实现命名空间函数javascript

时间:2013-01-14 04:21:21

标签: javascript design-patterns

我正在实现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文件的链接

1 个答案:

答案 0 :(得分:1)

在COOP中创建子命名空间时,

命名空间函数非常有用,它有助于避免多次检查。例如,您想要创建 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
});