工厂函数和构造函数的区别知多少?

1,698 阅读2分钟

「这是我参与2022首次更文挑战的第10天,活动详情查看:2022首次更文挑战」。

说起 工厂函数构造函数,我相信大家都不会陌生,但是如果要深究它俩的区别时,其实还是存在很多需要注意的的点,因此本篇文章就准备深入聊聊它俩,废话不多说,开搞!

ppx.jpg

什么是工厂函数

它其实就是用来生产 相同属性 的对象的函数,通过它我们可以构造出许多 属性相同,但拥有 不同属性值 的对象,下面给出一个代码示例,直观感受下

    function factory(name,age){
        const obj = {}
        obj.name = name
        obj.age = age
        return obj
    }
    var obj = factory('carl','28')

从代码示例中我们可以知道它的生产过程如下

  1. 接受自定义属性值
  2. 新建一个对象
  3. 给新建的对象赋值自定义属性
  4. 返回新创建的对象

由于每次生产过程中,都会重新创建对象,因此每一次生产出来的对象都是全新的

什么是构造函数

构造函数的作用其实跟工厂函数很类似,都是用来生产新对象的函数,下面给出代码示例

    function Constructor(name,age){
        this.name = name
        this.age = age
    }
    
    var obj = new Constructor('carl','28')

从代码示例中我们可以知道它的生产过程如下

  1. 接受自定义属性值
  2. 将自定义属性赋值给 this

构造函数与工厂函数的区别

通过代码示例我们可以很容易知道它俩的区别如下:

  1. 工厂函数的使用不借助 new,而构造函数需要
  2. 工厂函数没有使用 this
  3. 工厂函数需要 明确 返回新对象,而构造函数不需要

究其根本,造成它俩的差异的根本原因是 newthis 这俩东西,因此我们需要搞清楚这俩的运行原理,才能真正明白两种模式的区别

inte.jpg

new和this的运作方式

其实new做的事情很简单,流程如下

  1. 创建 一个新对象
  2. 将函数内部的this 指向 这个新对象
  3. 新对象的原型对象 指向 构造函数的原型对象
  4. 返回 this

这些步骤都是透明的,但每一次new的调用都会在背后补上上述操作,因此才会让构造函数的写法相比工厂函数更简洁,所以有句话说的好:哪有什么岁月静好,不过是有人替你负重前行

结语

工厂函数和构造函数在我们的日常开发中是会经常遇见的,因此一定要熟悉它俩,在合适的场景选用合适的方式,这样才能事半功倍~