0

我正在实现 Stoyan Stefanov 的 javascript 命名空间函数,因为我一直在阅读他的内容丰富的 JavaScript 模式书;在我的网络应用程序中,但不确定我是否以正确的方式使用它

这是我在此页面http://dalydd.com/projects/module_example/上的 Web 应用程序上使用的功能实现

     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 文件的直接链接

4

1 回答 1

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
});
于 2013-01-14T04:36:36.587 回答