2

我正在尝试学习此处引用的 JavaScript 模块模式。一切看起来都很棒,但我不断看到创建模块的不同方法。

在上面引用的文章中,他通过使用YAHOO.myProject.myModule.init();而不调用来访问模块的公共方法new。但后来我看到一些人做类似的事情var module = new YAHOO.myProject.myModule();。应该new使用,为什么?

4

5 回答 5

2

对此没有正确或错误的答案。

有时一个模块会包含一个不需要 new 关键字的对象。

define( [], function() {
   return {
      foo: "bar"
   };
};

有时一个模块会包含一个对象的构造函数,其中需要一个新的关键字。

define( [], function() {
   return function() {
      this.foo = "bar";
   };
};

有时一个模块将包含一个返回新对象的函数,其中不需要 new 关键字。

define( [], function() {
   var SomeConstructor = function() {
      this.foo = "bar";
   };
   return function() {
      return new SomeConstructor();
   };
};

使用部分取决于您要完成的工作,部分取决于您的团队编码偏好。

于 2012-10-02T16:39:28.833 回答
1

这一切都归结为myModule.

如果 的目的myModule是返回一个 100% 的新对象,并且里面myModule有很多使用 的赋值this.<X> = <Y>,那么是的,new这将是预期的操作过程。

...如果它不打算创建一个新对象,那么this将引用myProject并且任何this.<X> = <Y>;分配都将被反映为YAHOO.myProject.<X> = <Y>;并且使用new将是一个坏主意,如果您期望然后使用YAHOO.myProject.<X>来做某事...

所以这真的完全取决于发生了什么。

许多精通 JavaScript 的程序员(那些习惯于以不同于编写 C++、Java 或 C# 的方式思考 JS 的人)会尽量避免new在此类情况下使用需要的模式,因为它对于什么myModule 模棱两可的,并且有一个许多其他合适的模式在 JS 中实现起来非常简单。

于 2012-10-02T16:21:00.283 回答
0

由于模块通常是单例而不是构造函数,因此不应使用new. 另请参阅此答案

于 2012-10-02T16:14:50.350 回答
0

Javascript 中的new关键字分配一个新对象,然后将其设置为this在构造函数调用中。如果您只是将模块用作将返回在函数本身中分配的对象的函数,new则没有必要。

于 2012-10-02T16:15:59.293 回答
0

因为,至少在声明时,javascript 不区分对象和函数,所以在创建对象时必须使用 new。但是,发生这样的模式通常会很好。

function myObject() {
    if (!(this instanceof myObject)) {
        return new myObject();
    }
}

这样做是为了确保它始终是myObject.

于 2012-10-02T16:16:51.863 回答