避免名称空间污染的模式

Patterns for avoiding name-space pollution

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

我的问题是:有什么普遍接受的'best'方式吗?为我的项目选择一个时有哪些注意事项?

直接赋值

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();

没有公认的最佳方法。对不起。

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

任何基于 IIFE 的解决方案都应该可以正常工作,而且它们大多可以互换。模块(或显示模块)可以说是最简单的。命名空间参数允许您在多个文件上拆分一个模块,这是我选择永远不会做的事情,但如果那是您想要的,它可能会有用。我看不出 "this as a Namespace Proxy" 方法有任何真正的优势。