基本区别在于,构造函数与new
关键字一起使用(这会使JavaScript自动创建一个新对象,this
在该函数内将该对象设置为该对象,然后返回该对象):
var objFromConstructor = new ConstructorFunction();
var objFromFactory = factoryFunction();
但是要使其成为“工厂”,就需要返回某个对象的新实例:如果它仅返回布尔值或其他内容,则不会将其称为“工厂”函数。这不会像和一样自动发生new
,但在某些情况下确实提供了更大的灵活性。
function ConstructorFunction() {
this.someProp1 = "1";
this.someProp2 = "2";
}
ConstructorFunction.prototype.someMethod = function() { /* whatever */ };
function factoryFunction() {
var obj = {
someProp1 : "1",
someProp2 : "2",
someMethod: function() { /* whatever */ }
};
// other code to manipulate obj in some way here
return obj;
}
当然,您可以使工厂功能比该简单示例复杂得多。
有些人喜欢对所有功能使用工厂功能,只是因为他们不喜欢记住要使用它new
(编辑:这可能是一个问题,因为没有new
该功能仍会运行,但不会按预期运行)。我没有看到这有什么好处:new
它是语言的核心部分,因此我特意避免使用它是任意的- 最好避免使用其他关键字,例如else
。