有人可以澄清Javascript中的构造函数和工厂函数之间的区别。
何时使用一个代替另一个?
基本区别在于,构造函数与new关键字一起使用(这会使JavaScript自动创建一个新对象,this在该函数内将该对象设置为该对象,然后返回该对象):
new
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。
else
工厂功能的一个优点是,根据某些参数,要返回的对象可以是几种不同的类型。