我已经读过为JavaScript项目创建命名空间有助于减少与其他库的冲突。我有一些代码,有许多不同类型的对象,我已经定义了构造函数。将这些内容放入命名空间也是一种好习惯吗?
例如:
var shapes = {
Rectangle: function(w, h) {
this.width = w;
this.height = h;
}
};
可以通过以下方式调用:
var square = new shapes.Rectangle(10,10);
答案 0 :(得分:5)
这通常是一个好主意;另外,如果你的对象需要一组不应该公开的共享函数,你可以将它们全部包装在一个闭包中,比如模块:
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);
答案 1 :(得分:4)
此命名空间称为“Singleton pattern”,它是着名的“Gang of Four”设计模式书推荐的主要模式之一。
来自伟大(免费)的书Learning JavaScript Design Patterns:
传统上,Singleton模式可以通过创建一个来实现 class,如果有一个方法,则创建一个新的类实例 不存在。如果一个实例已经存在,那就简单了 返回对该对象的引用。因此,单例模式是已知的 因为它将类的实例化限制为单个对象。
在JavaScript中,单例作为隔离的命名空间提供程序 来自全局命名空间的实现代码,以便提供 功能的单一访问点。
它们可以采用多种不同的形式,但最基本的形式是a Singleton可以实现为组合在一起的对象文字 及其相关的功能和属性......
所以是的,它在许多编程语言中都是一个很好用的概念,非常适合防止JavaScript中的全局命名空间对象冲突。
另请参阅:Simplest/Cleanest way to implement singleton in JavaScript?
答案 2 :(得分:2)
是。你应该尽可能地污染全局命名空间
答案 3 :(得分:2)
是的,这是一个好主意,因为您可以避免因污染全局命名空间而导致的麻烦和混乱。虽然我个人会将shapes
更改为shape
,但您可以拥有shape.Rectangle
,这对我来说更有意义(毕竟,矩形只是一个对象)。< / p>
答案 4 :(得分:1)
除了不污染命名空间外,它还允许您进行类型族检查:
function doSomethingTo(shape) {
var shapeName, validArg;
for (shapeName in shapes) {
validArg = validArg || shape instanceof shapes[shapeName];
}
if ( !validArg ) throw "Argument is not a shape.";
}