避免名称空间污染的模式

时间:2015-01-07 20:00:26

标签: javascript design-patterns namespaces global

This文章描述了一些避免名称空间污染的模式。我列出了下面的模式,以及文章中给出的部分示例代码。

我的问题是:有没有任何普遍接受的'最佳'方式?为我的项目选择一个时需要考虑哪些因素?

直接分配

var myApp = {}
myApp.id = 0;
myApp.next = function() {
    return myApp.id++;  
}

使用对象文字表示法

var myApp = {
    id: 0,
    next: function() {
        return this.id++;   
    }
}

模块模式

var myApp = (function() {
    var id= 0;
    return {
        next: function() {
            return id++;    
        },
    };  
})();  

命名空间参数

var myApp = {};
(function(context) { 
    var id = 0;
    context.next = function() {
        return id++;    
    };
 })(myApp);  

这是一个名称空间代理

var myApp = {};
(function() {
    var id = 0;
    this.next = function() {
        return id++;    
    };
    this.reset = function() {
        id = 0;     
    }
}).apply(myApp);   

我目前使用的方法

我在自己的项目中使用了以下方法。这不好吗?

function MyObj(){
    this.someProperty = 'something';
}
MyObj.prototype.someFunction = function(){
    this.someProperty =5;
}
myApp = new MyObj();

1 个答案:

答案 0 :(得分:1)

没有普遍接受的最佳方法。遗憾。

正如Pointy所说,你的方法涉及创建MyObj构造函数,它可能永远不会再次使用,以及myApp命名空间对象。它至少有一个其他的小缺点:你不能阻止自己或其他人使用代码再次调用MyObj,这对于那些应该是你的命名空间的东西来说很奇怪。 p>

任何基于IIFE的解决方案都应该可以正常工作,并且它们大多可以互换。模块(或揭示模块)可以说是最简单的。命名空间参数允许您将模块分解为多个文件,这是我选择永远不会做的事情,但如果这是您想要的,那么它可能是有用的。我无法看到"这是一个命名空间代理"方法