js中寄生构造函数模式和工厂模式的区别

function SpecialArray(){
    var values = new Array();
    values.push.apply(values, arguments);
    values.toPipedString = function(){
        return this.join("|");
    }
    return values;
}
var a = new SpecialArray(2,6,8,9,4);
a.toPipedString();
var b = SpecialArray(2,6,8,9,4);
b.toPipedString();

使用或不使用new好像并没有什么区别。

另外寄生构造函数可以做的工作,工厂模式也能实现;那这种寄生构造函数存在有什么意义?

阅读 9.9k
8 个回答

这里使用寄生构造函数的目的是希望扩展Array的一个方法toPipeMessage,作者本意是期望能像使用普通Array一样使用SpecialArray,故虽然把specialarray当成函数也一样能用,但是这并不是作者的本意,也变得不优雅。

寄生构造函数专门用来为js原生的构造函数定义新的方法。。
像上面的例子中,SpecialArray()返回了一个对象values,这个valuesArray“唯一”的区别就是比Array多了一个自定义的方法。。如果直接在Array中定义新的方法,会污染其它的数组对象甚至造成不必要的麻烦。

【JavaScript】【对象】创建对象、对象继承的实用方式及理解。之前写的文章,总结了一下几种常用的创建对象、对象继承的方式。

寄生构造函数模式和工厂模式没有本质区别,通过new 操作符的就叫寄生构造函数模式,直接调用的就叫工厂模式

JS里的构造函数就是一个用来构造对象的普通函数,和JAVA不同

你要知道,通过new 来调用函数,会自动执行下面操作

  1. 创建一个全新的对象

  2. 这个对象会被执行[[prototype]]连接原型

  3. 函数调用中的this会绑定到新对象

  4. 如果函数没有返回其他对象,那么new 构造就会自动返回这个新对象

由于这里new调用和直接调用都返回values,所以a,b引用的数组对象是一样的

“寄生器构造函数”可以在构造函数不适应的情况使用,比如要创建一个数组类型,像题主给的代码一样(因为构造函数只能创建对象类型)。为了让人一看就知道是在构造一个新的对象类型的实例,所以虽然它写的和工厂模式一样,但是创建时用了new,因此使得实现的过程不一样,和楼上的回答一样(但是实现过程不重要)。
具体作用,比如创建具有额外方法的已有类型(如数组,Date类型等),但是又不污染原有的类型。
所以就算没有new也一样,只不过加上new让人清楚这是新对象类型的实例,也是“寄生器构造函数”里有个“构造函数”的原因。

如果你的函数创建对象并返回,那就是所谓的“工厂模式”,无论你加不加 new 都是工厂模式(简单来说就是会覆盖)。

如果你的函数直接用了 this,那么它就是构造器,并且,不用 new 就得不到新对象。

新手上路,请多包涵

作者的本意是为了使用起来跟平常的构造函数一样!为迎合这个目的函数名是大写;自然而然的使用new创建对象。

新手上路,请多包涵

看了下高级程序设计里,如题主的例子,不加new 的方式创建对象的方法,叫稳妥构造函数模式。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏