在 JS 中,函数的调用方式有两种,分别是直接调用和 new 关键字调用。对于一个构造函数,我们肯定是不希望它直接被调用的,所以我们在函数内部就应该要判断是何种调用。
在 ES 6 之前,我们可以使用下面的方式来判断
js
function Test(){
if(!(this instanceof Test)){
throw new Error("该函数没有使用new调用");
}
}但是这里有一个问题,this 这个东西是可以使用 call 和 apply 修改掉的,这样就可以绕开这种判定,所以其实这种方式并不完美。
为了解决这个问题,ES 6 提供了一种方式来在函数内部帮助我们判断是不是通过 new 关键字进行调用。使用 new.target 即可,如果没有使用 new 来调用函数,则返回 undefined,如果使用了 new 来调用函数,的得到的是 new 关键字调用的函数本身。