Joe*_*Joe 9 javascript namespaces
我已经读过为JavaScript项目创建命名空间有助于减少与其他库的冲突.我有一些代码,有许多不同类型的对象,我已经定义了构造函数.将这些放在命名空间中也是一种好习惯吗?
例如:
var shapes = {
Rectangle: function(w, h) {
this.width = w;
this.height = h;
}
};
Run Code Online (Sandbox Code Playgroud)
可以通过以下方式调用:
var square = new shapes.Rectangle(10,10);
Run Code Online (Sandbox Code Playgroud)
这通常是一个好主意; 另外,如果你的对象需要一组不应该公开的共享函数,你可以将它们全部包装在一个闭包中,比如模块:
var shapes = (function() {
// private variables
var foo = 0;
// private function
function get_area(w, h)
{
return w * h;
}
return {
Rectangle: function(w, h) {
this.width = w;
this.height = h;
// call private function to determine area (contrived example)
this.area = get_area(w, h);
}
}
}());
var s = new shapes.Rectangle(100, 5);
Run Code Online (Sandbox Code Playgroud)
这种命名空间称为“单例模式”,是著名的“四人帮”设计模式书籍推荐的主要模式之一。
来自伟大(且免费)的《学习 JavaScript 设计模式》一书:
传统上,单例模式可以通过创建一个类来实现,该类的方法是在该类不存在时创建该类的新实例。如果实例已经存在,它只是返回对该对象的引用。单例模式因此而闻名,因为它将类的实例化限制为单个对象。
在 JavaScript 中,单例充当命名空间提供者,将实现代码与全局命名空间隔离,以便为函数提供单点访问。
它们可以采用多种不同的形式,但在最基本的情况下,单例可以实现为与其相关函数和属性组合在一起的对象文字......
所以,是的,它是许多编程语言中广泛使用的概念,并且非常适合防止 JavaScript 中的全局名称空间对象冲突。
另请参阅:在 JavaScript 中实现单例的最简单/最干净的方法?