new 是组织函数天生实例的下令, ES6为 new 下令引入了 new.target属性。这个属性用于确定组织函数是怎么挪用的。在组织函数中, 若是一个组织函数不是通过 new操作符挪用的, new.target会返回 undefined。
es5中是这样做的:
function Shape(options) { if (this instanceof Shape) { this.options = options } else { // 要么手动给它建立一个实例并返回 // return new Shape(options) // 要么提醒 throw new Error('Shape 组织函数必须使用 new 操作符') } }
es6中可以这样做:
function Shape(options) { // if (new.target !== 'undefined') {} 必须要在 constructor中使用 new.target, 在这里判断会报错 constructor(options) { if (new.target !== 'undefined') { this.options = options } else { throw new Error('必须使用 new 操作符') } } }
以上代码通过 new.target 属性判断返回的是不是undefined即可知道这个组织函数是不是通过 new 操作符挪用
new.target这个属性,当子类继续父类会返回子类的组织函数名称
class Parent { constructor() { console.log(new.target) } } class Child extends Parent { constructor() { super() } } // Child
以上代码 Child子类继续父类, 那么父类组织函数中的 new.target 是子类组织函数的名称。
class Zoo { constructor() { if (new.target === Zoo) throw new Error('Zoo组织函数只能用于子类继续') } } const zoo = new Zoo() // 报错 class Dog extends Zoo { constructor() { super() } } const dog = new Dog() // 不报错
tip : new.target 在外部使用会报错
来自:https://www.cnblogs.com/qiqingfu/archive/2019/01/01/10206477.html
1.阿里云: 本站现在使用的是阿里云主机,平安/可靠/稳固。点击领取2000米代金券、领会最新阿里云产物的种种优惠流动点击进入
2.腾讯云: 提供云服务器、云数据库、云存储、视频与CDN、域名等服务。腾讯云各种产物的最新流动,优惠券领取点击进入
3.广告同盟: 整理了现在主流的广告同盟平台,若是你有流量,可以作为参考选择适合你的平台点击进入
链接: http://www.fly63.com/article/detial/1742