避免名称空间污染的模式
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" 方法有任何真正的优势。
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" 方法有任何真正的优势。