前几天在复看 es6 的时候看到这个东西(new.target), 个人觉得挺好的,然后想跟大家分享一下
什么是 new.targer?它有什么用?它能干什么?
- new.target 是 es6 新增加的一个东西,它返回的是某个构造函数或者是 undefined。
- new.target 可以判断构造函数是 new 实例化的还是直接调用的,如果是通过 new 实例化的,会返回这个构造函数,如果直接调用的,返回的就是 undefined。
- 如果通过 es5 写构造函数的时候,可以通过 new.target 返回的值,确保构造函数是通过 new 实例化,而不是直接调用;如果通过 es6 写构造类的时候,也可以通过 new.target 返回的值,确保祖先类只能被继承,不猛被实例化。
es5
function Person(name){if(new.target === undefined){throw new Error("必须通过 new 来实例化")
}
this.name = name;
}
// 如果不通过 new 实例化的话, 直接报错
var Jack = Person("su")
es6(这里说一下,Person 被继承之后,new.target 不再指向 Peoson, 会指向子类的构造函数)
class Person{constructor(name) {if(new.target === Person){throw new Error("该类只能继承不能被实例化")
}
this.name = name
}
}
// Person 实例化直接报错
class July extends Person{constructor(name,age){super(name),
this.age = age
}
eat(){console.log(this.age,this.name)
}
}
var Jack = new July("su",21)
——end——