Javascript 避免名称空间污染的模式

Javascript 避免名称空间污染的模式,javascript,design-patterns,namespaces,global,Javascript,Design Patterns,Namespaces,Global,文章介绍了一些避免名称空间污染的模式。我在下面列出了一些模式,以及本文给出的部分示例代码 我的问题是:有没有普遍接受的“最佳”方式?在为我的项目选择一个时有哪些考虑因素 直接分配 var myApp = {} myApp.id = 0; myApp.next = function() { return myApp.id++; } var myApp = {}; (function(context) { var id = 0; context.next = func

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

我的问题是:有没有普遍接受的“最佳”方式?在为我的项目选择一个时有哪些考虑因素

直接分配

var myApp = {}
myApp.id = 0;
myApp.next = function() {
    return myApp.id++;  
}
var myApp = {};
(function(context) { 
    var id = 0;
    context.next = function() {
        return id++;    
    };
 })(myApp);  
使用对象文字符号

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

var myApp = {
    id: 0,
    next: function() {
        return this.id++;   
    }
}
var myApp = (function() {
    var id= 0;
    return {
        next: function() {
            return id++;    
        },
    };  
})();  
名称空间参数

var myApp = {}
myApp.id = 0;
myApp.next = function() {
    return myApp.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
,这对于应该是您的命名空间的东西来说是很奇怪的


任何基于iLife的解决方案都应该可以很好地工作,而且它们基本上是可以互换的。模块(或显示模块)可以说是最简单的。namespace参数允许您在多个文件上断开一个模块,我选择从不这样做,但如果这是您想要的,它可能会很有用。我看不出“this as a Namespace Proxy”方法有什么真正的优势。

您正在创建两个全局符号,而不是一个,因此如果您认为这不好,那么它就不好。我喜欢名称空间参数模式,但我有一个问题。在我使用的方法中,我可以通过执行
myObj1=newmyobj()实例化多个对象;myObj2=新的MyObj()
和所有对象共享相同的函数,因为它们绑定到相同的原型对象。在每个对象共享相同方法的情况下,如何通过参数模式使用名称空间实例化多个对象?实际上,关键是您不会这样做。通常使用的名称空间是单数的。这才是重点。如果您正在寻找一般的对象构造模式,那么这不是正确的选项列表。然后你可以做你提到的简单的原型工作,使用
Object.create
,从众多的帮助程序库中选择一个,或者只是javascript对象创建模式。谢谢。我显然把两件事搞混了。所以我想如果你把它们结合起来,你会得到这个:。如果要重用不使用名称空间参数模式的组件,则只需在所有函数和变量引用之前删除名称空间。这似乎是一个很好的解决方案。是的,当然您可以在名称空间代码块中使用各种模式,包括这个原型OO模式。