想象一下以下场景:
function Car(color,size){
if(!(this instanceof Car)){//让调用者用new的方式调用
throw new Error('请使用关键字new');
}
this.color = color;
this.size = size;
}
const p = new Car('blue',100)
const p1 = Car('yellow',150)//抛出错误
const p2 = Car.call(new Car(),'blue',200)//正常运行
以前为了使调用者用new 关键字调用还是函数,会加一个判断,判断创建的对象是不是由Car函数构造的,一般场景能解决,但不乏有人投机,用p2的方式创建。所以以前的办法是不近完美的。
new.target是一个表达式,如果是使用new 调用该函数,该表达式表示该函数。
如果不是,则返回undefiend;
基于上述理论,只要将原来的代码中判断条件改为 new.target == undefined,就完美了