命名空间内的构造函数

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)

Ja͢*_*͢ck 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);
Run Code Online (Sandbox Code Playgroud)


bul*_*ley 4

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

来自伟大(且免费)的《学习 JavaScript 设计模式》一书:

传统上,单例模式可以通过创建一个类来实现,该类的方法是在该类不存在时创建该类的新实例。如果实例已经存在,它只是返回对该对象的引用。单例模式因此而闻名,因为它将类的实例化限制为单个对象。

在 JavaScript 中,单例充当命名空间提供者,将实现代码与全局命名空间隔离,以便为函数提供单点访问。

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

所以,是的,它是许多编程语言中广泛使用的概念,并且非常适合防止 JavaScript 中的全局名称空间对象冲突。

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

  • @joe当然,如果对象文字包含构造函数,则不被视为单例模式;-) (2认同)