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模式。