明确函数的双重用途
在很多情况下当我们调用一个函数时,需要new
来调用而不用new
来调用的话会出现很多问题,比如this
指向问题等等。而在以前的语法当中我们无法判断其调用时是否使用new
来调用,一般情况下我们通常用if
判断它原型链上的指向是否有自身来判断,不但有些麻烦而且还并不是特别完善。
所以ES6提供了一个特殊的API,可以使用该API在函数内部,判断该函数是否使用了new来调用
new.target
//该表达式,得到的是:如果没有使用new来调用函数,则返回undefined
//如果使用new调用函数,则得到的是new关键字后面的函数本身
function Person(firstName, lastName) {
//判断是否是使用new的方式来调用的函数
// //过去的判断方式
// if (!(this instanceof Person)) {
// throw new Error("该函数没有使用new来调用")
// }
if (new.target === undefined) {
throw new Error("该函数没有使用new来调用")
}
this.firstName = firstName;
this.lastName = lastName;
this.fullName = `${firstName} ${lastName}`;
}
const p1 = new Person("袁", "进");//此时由于正常调用所以并没有任何问题
console.log(p1)
const p2 = Person("袁", "进");
//在这里无论是直接调用还是通过call来改变this指向,所返回的数据都是undefined
console.log(p2);
const p3 = Person.call(p1, "袁", "进")//同理
console.log(p3);