🤔有时候我们在开发组件或者插件的过程中,会需要去判断一个函数是否是是用new关键字来调用,如果是则做一些业务处理,否则抛出异常。那么在JS中我们该怎么去判断呢?大概有几种方式呢?
经过查阅,大概有以下3种
- 通过
use strict
判断 - 通过
instanceof
判断 - 通过
constructor
判断 - 通过 ES6 中的
new.target
判断
1、通过 use strict
普通调用时严格模式下this指向undefined,赋值操作会报错,new调用时this指向实例对象。
var Person = function () {
'use strict';
try {
this.name = 'BabyChin';
console.log('new调用');
} catch (e) {
console.log('普通调用');
}
}
var p1 = new Person(); // new调用
var p2 = Person(); // 普通调用
2、通过 instanceof
普通调用时this指向全局对象,new调用时this指向实例对象。
var Person = function () {
if (this instanceof Person) {
console.log('new调用');
} else {
console.log('普通调用');
}
}
var p1 = new Person(); // new调用
var p2 = Person(); // 普通调用
3、通过 constructor
普通调用时constructor指向全局对象,new调用时constructor指向构造函数本身。
var Person = function () {
if (this.constructor === Person) {
console.log('new调用');
} else {
console.log('普通调用');
}
}
var p1 = new Person(); // new调用
var p2 = Person(); // 普通调用
4、通过 new.target
普通调用时target默认指向undefined,new调用时target指向Foo的实例对象。
var Person = function () {
if (new.target === Person) {
console.log('new调用');
} else {
console.log('普通调用');
}
}
var p1 = new Person(); // new调用
var p2 = Person(); // 普通调用
😄点点滴滴都记录一下。
评论区