9

我读过为 JavaScript 项目创建命名空间有助于减少与其他库的冲突。我有一些代码,其中包含许多不同类型的对象,我为其定义了构造函数。将它们也放在命名空间中是一种好习惯吗?

例如:

var shapes = {
    Rectangle: function(w, h) {
        this.width = w;
        this.height = h;
    }
};

可以通过以下方式调用:

var square = new shapes.Rectangle(10,10);
4

5 回答 5

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);
于 2012-06-10T16:38:56.903 回答
4

这种命名空间被称为“单例模式”,它是著名的“四人帮”设计模式书推荐的主要模式之一。

来自伟大的(和免费的)书学习 JavaScript 设计模式

经典地,单例模式可以通过创建一个类来实现,该类具有一个方法,如果该类的新实例不存在,则该方法会创建一个新实例。在实例已经存在的情况下,它只返回对该对象的引用。因此,单例模式之所以为人所知,是因为它将类的实例化限制为单个对象。

在 JavaScript 中,单例作为命名空间提供者将实现代码与全局命名空间隔离开来,从而为函数提供单点访问。

它们可以采用多种不同的形式,但在最基本的情况下,Singleton 可以实现为与其相关函数和属性组合在一起的对象字面量......

所以是的,它在许多编程语言中是一个很好用的概念,并且非常适合防止 JavaScript 中的全局命名空间对象冲突。

另请参阅:在 JavaScript 中实现单例的最简单/最干净的方法?

于 2012-06-10T16:32:09.630 回答
2

是的。您应该尽可能少地污染全局命名空间

于 2012-06-10T16:30:30.717 回答
2

是的,这是个好主意,因为您避免了因污染全局命名空间而造成的麻烦和混乱。虽然我个人会shapes改为shape,所以你可以有一个shape.Rectangle,这对我来说更有意义(毕竟,一个 Rectangle 只是一个对象)。

于 2012-06-10T16:32:41.370 回答
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.";
}
于 2012-06-10T16:37:22.137 回答