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();
答案 0 :(得分:1)
没有普遍接受的最佳方法。遗憾。
正如Pointy所说,你的方法涉及创建MyObj
构造函数,它可能永远不会再次使用,以及myApp
命名空间对象。它至少有一个其他的小缺点:你不能阻止自己或其他人使用代码再次调用MyObj
,这对于那些应该是你的命名空间的东西来说很奇怪。 p>
任何基于IIFE的解决方案都应该可以正常工作,并且它们大多可以互换。模块(或揭示模块)可以说是最简单的。命名空间参数允许您将模块分解为多个文件,这是我选择永远不会做的事情,但如果这是您想要的,那么它可能是有用的。我无法看到"这是一个命名空间代理"方法