箭头函数不可以使用new
来生成实例,而普通构造函数可以。
- 普通构造函数与
new
操作符- 当使用
new
关键字调用一个普通构造函数时,会发生以下几个步骤:- 创建一个新的空对象,这个对象的内部
[[Prototype]]
属性会被设置为构造函数的prototype
属性。例如:function Person(name) { this.name = name; } let p = new Person('John'); console.log(p.__proto__ === Person.prototype); // true
- 将构造函数内部的
this
指向这个新创建的对象。在函数体中,通过this
来添加属性和方法到这个新对象上。例如在Person
函数中,this.name = name
就是给新对象添加了一个name
属性。 - 如果构造函数没有显式返回一个对象,则自动返回这个新创建的对象。所以
let p = new Person('John');
返回的p
就是包含name
属性的新对象。
- 创建一个新的空对象,这个对象的内部
- 当使用
- 箭头函数的特性导致不能使用
new
- 箭头函数没有自己的
this
,它的this
是从外层作用域继承而来的。当使用new
操作符时,需要创建一个新的对象并将其绑定到this
,但箭头函数本身没有这个机制。 - 箭头函数也没有
prototype
属性。构造函数的prototype
属性用于定义通过new
创建的对象所继承的属性和方法,由于箭头函数没有这个属性,所以无法像普通构造函数那样为新对象设置原型链。 - 例如,下面的代码会报错:
let ArrowPerson = (name) => { this.name = name; }; let p = new ArrowPerson('Alice');// 报错:ArrowPerson is not a constructor
- 这里的
ArrowPerson
被当作构造函数使用,但是由于箭头函数的特性,它无法完成new
操作所需要的步骤,所以会抛出错误。
- 箭头函数没有自己的