デュアル使用クリア機能
私たちは関数を呼び出すとき、多くの場合、あなたが必要とするnew
ことなく呼び出すことがnew
、その後のような問題の多くがあるだろう、呼び出すためにthis
問題を指しているというように。我々は、彼らが呼ぶときかどうかを使用することに決定することができないその前の構文でnew
呼び出すために、一般的に、我々は通常使用しif
、それはプロトタイプチェーンを指しているかどうかを判断するだけでなく、面倒なだけでなく、いくつかの特に完璧ではない、独自の判断を持っています。
従ってES6は特別なAPIを提供し、API関数内で使用することができる、機能は、新しいを呼び出すか否かを判断します
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);