这是一个很好的模式?

目标...

  • 从全局对象中删除变量,对象等。
  • 消除碰撞的可能性。
  • 首先,我实现了Yahoo命名空间代码(注意,例如,我使用ROOT作为我的命名空间的根目录)...

            if (typeof ROOT == "undefined" || !ROOT) {
                    var ROOT = {};
            }
    
            ROOT.namespace = function () {
                var a = arguments,
                    o = null,
                    i, j, d;
                for (i = 0; i < a.length; i = i + 1) {
                    d = ("" + a[i]).split(".");
                    o = ROOT;
                    for (j = (d[0] == "ROOT") ? 1 : 0; j < d.length; j = j + 1) {
                        o[d[j]] = o[d[j]] || {};
                        o = o[d[j]];
                    }
                }
                return o;
            }
    

    现在我声明我的第一个命名空间...

    ROOT.namespace("UI");
    
                ROOT.UI = {
                    utc: 12345,
                    getUtc: function() {
                        return this.utc;
                    }
                }
    

    我想在这里做的是保存我需要的用户界面的变量(在本例中是UTC的当前时间),以便它们不在全局对象上。 我也想提供一些特定的功能。 这应该在没有任何实例的每个页面上可用...

    现在我想要在我的命名空间结构中存储一个对象。 但是,该对象需要多次创建。 这里的目标是将其保留在我的结构中,但允许它根据需要创建多次。 这如下所示:

     ROOT.namespace("AirportFinder");
                ROOT.AirportFinder = function(){ 
                    this.var1 = 99999;
    
                    this.Display = function() {
                        alert(this.var1);
                    }            
                }
    

    这是实例化对象的示例代码...

            var test1 = new ROOT.AirportFinder();
            test1.Display();
    

    这是一个很好的模式?


    在命名空间ROOT或类似的东西上定义事物确实是合理的。

    使用闭包也更好

    (function() {
        var AirportFinder = function() { 
            this.var1 = 99999;
            this.Display = function() {
                alert(this.var1);
            }            
        };
    
        // do Stuff with local AirportFinder here.
    
        // If neccesary hoist to global namespace
        ROOT.AirportFinder = AirportFinder;
    }());
    

    如果他们不需要是全球性的。 我自己使用别名( $.foobar因为jQuery是全局的),用于存储任何全局数据。

    恐怕我不能告诉你.namespace函数的作用。 这并不是真正必要的。

    我个人的偏好是总是使用闭包创建一个私有名称空间,并将任何东西提升到需要的全局/共享名称空间。 这将全局可见性/集群降至最低。


    稍微指点一下你的问题的路径:看看YUI3(http://developer.yahoo.com/yui/3/) - 你没有(有) 任何东西全球名称空间,你会得到一个私人沙箱。 伟大的概念,我喜欢那个图书馆和它的概念(YUI3,不是在谈论老YUI2)。 它的做法当然很简单,你也可以这样做:YUI3的动态模块加载器加载你的模块(.js文件),创建一个沙箱(只是一个闭包)并调用你的回调,给它一个处理沙盒。 任何地方的其他代码都无法访问该沙箱和您自己的名字。 在沙箱内,你可以(也应该)继续使用各种封装模式。 这个YUI3概念非常适合与外国代码混搭,尤其是当混搭变得更具动态性(例如用户触发)时,而不是仅仅由程序员自己集成Google Maps或其他众所周知的API。


    我试图做一件类似的事情:

    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/

    链接地址: http://www.djcxy.com/p/95301.html

    上一篇: Is this a good pattern?

    下一篇: Page Web Application Design?