我正在尝试学习此处引用的 JavaScript 模块模式。一切看起来都很棒,但我不断看到创建模块的不同方法。
在上面引用的文章中,他通过使用YAHOO.myProject.myModule.init();
而不调用来访问模块的公共方法new
。但后来我看到一些人做类似的事情var module = new YAHOO.myProject.myModule();
。应该new
使用,为什么?
我正在尝试学习此处引用的 JavaScript 模块模式。一切看起来都很棒,但我不断看到创建模块的不同方法。
在上面引用的文章中,他通过使用YAHOO.myProject.myModule.init();
而不调用来访问模块的公共方法new
。但后来我看到一些人做类似的事情var module = new YAHOO.myProject.myModule();
。应该new
使用,为什么?
对此没有正确或错误的答案。
有时一个模块会包含一个不需要 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();
};
};
使用部分取决于您要完成的工作,部分取决于您的团队编码偏好。
这一切都归结为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 中实现起来非常简单。
由于模块通常是单例而不是构造函数,因此不应使用new
. 另请参阅此答案。
Javascript 中的new
关键字分配一个新对象,然后将其设置为this
在构造函数调用中。如果您只是将模块用作将返回在函数本身中分配的对象的函数,new
则没有必要。
因为,至少在声明时,javascript 不区分对象和函数,所以在创建对象时必须使用 new。但是,发生这样的模式通常会很好。
function myObject() {
if (!(this instanceof myObject)) {
return new myObject();
}
}
这样做是为了确保它始终是myObject
.