ES6 为new命令引入了一个new.target属性,该属性一般用在构造函数之中,返回new命令作用于的那个构造函数(当前正在执行的函数)
如果构造函数不是通过new命令或Reflect.construct()调用的,new.target会返回undefined,因此这个属性可以用来确定构造函数是怎么调用的。
function Person(name) {
if (new.target !== undefined) {
this.name = name;
} else {
throw new Error('必须使用 new 命令生成实例');
}
}
// 另一种写法
function Person(name) {
if (new.target === Person) {
this.name = name;
} else {
throw new Error('必须使用 new 命令生成实例');
}
}
var person = new Person('张三'); // 正确
var notAPerson = Person.call(person, '张三'); // 报错
Class 内部调用new.target,返回当前 Class。
class Rectangle {
constructor() {
console.log(new.target === Rectangle)
}
}
const obj = new Rectangle() // true
子类继承父类时,new.target会返回子类
class Rectangle {
constructor() {
console.log(new.target === Rectangle)
}
}
class Square extends Rectangle {}
const obj = new Square() // false