基本区别在于构造函数与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.
工厂函数的一个优点是,根据某些参数,要返回的对象可以有几种不同的类型。