箭头函数为什么不能用作构造函数
要弄清楚这个问题,我们需要明白以下几点:
- 何为构造函数,他有什么特点?
- 什么是箭头函数,他有什么特点?
构造函数
构造函数可以称之为类,通过构造函数可以创建一系列类似的实例对象(详细不展开叙述)。构造函数有一个突出的特点就是它可以通过 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的新增函数定义方式,他有如下特点(语法方面不详述):
- 没有自己的
this,只会从父作用域中继承this - 无论如何调用箭头函数,其
this指向都不会发生改变;箭头函数的this在定义的时候已经确定了;call()、apply()、bind()也无法改变箭头函数中this的指向。 - 箭头函数没有自己的
arguments对象,即使在箭头函数中调用arguments对象,引用的也只是父作用域中的arguments对象。 - 箭头函数没有原型prototype。
- 箭头函数中没有
yield关键字,不能用作Generator函数。
总结
了解了构造函数的特点和箭头函数的特点之后,不难解释为什么箭头函数不能作为构造函数。因为箭头函数没有自己的this,在使用构造函数 new 一个对象的时候无法绑定和修改 this;同时箭头函数也没有 prototype 属性,无法将该属性赋给实例对象的 __proto__。