命名空间内的构造函数

时间:2012-06-10 16:28:24

标签: javascript namespaces

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

例如:

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

可以通过以下方式调用:

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

5 个答案:

答案 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.";
}