[路飞]箭头函数为什么不能用作构造函数

2,118 阅读2分钟

箭头函数为什么不能用作构造函数

要弄清楚这个问题,我们需要明白以下几点:

  1. 何为构造函数,他有什么特点?
  2. 什么是箭头函数,他有什么特点?

构造函数

构造函数可以称之为类,通过构造函数可以创建一系列类似的实例对象(详细不展开叙述)。构造函数有一个突出的特点就是它可以通过 new 来创建一个实例。

new 的过程中发生了什么?

首先会创建一个空对象,将该对象的 __proto__ 属性指向构造函数的prototype,然后将构造函数的this指向该对象并执行构造函数,如果构造函数有返回值且返回值是对象类型,则返回该返回值,否则返回this指向的对象。

我们通过一段代码来模拟这个过程

const Person = function(name,age) {
    this.name = name
    this.age = age
}

function myNew(fn,name,age) {
    const obj = {} //创建一个空对象
    obj.__proto__ = fn.prototype //将该对象的 `__proto__` 属性指向构造函数的`prototype`
    const result = fn.call(obj,name,age) // 将构造函数的`this`指向该对象并执行构造函数
    return typeof result === 'object' ? result : obj // 返回
}
const person = myNew(Person,'Jack',18)

箭头函数

箭头函数是ES6的新增函数定义方式,他有如下特点(语法方面不详述):

  1. 没有自己的 this,只会从父作用域中继承 this
  2. 无论如何调用箭头函数,其 this 指向都不会发生改变;箭头函数的this在定义的时候已经确定了;call()、apply()、bind()也无法改变箭头函数中this的指向。
  3. 箭头函数没有自己的arguments对象,即使在箭头函数中调用arguments对象,引用的也只是父作用域中的arguments对象。
  4. 箭头函数没有原型prototype。
  5. 箭头函数中没有yield关键字,不能用作 Generator函数

总结

了解了构造函数的特点和箭头函数的特点之后,不难解释为什么箭头函数不能作为构造函数。因为箭头函数没有自己的this,在使用构造函数 new 一个对象的时候无法绑定和修改 this;同时箭头函数也没有 prototype 属性,无法将该属性赋给实例对象的 __proto__