有时候我们在开发组件或者插件的过程中,会需要去判断一个函数是否是是用new关键字来调用,如果是则做一些业务处理,否则抛出异常。那么在JS中我们该怎么去判断呢🤔?
经过查阅网络资料,大概有以下4种:
- 通过
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指向Person的实例对象。
var Person = function () {
if (new.target === Person) {
console.log('new调用');
} else {
console.log('普通调用');
}
}
var p1 = new Person(); // new调用
var p2 = Person(); // 普通调用
本文介绍了四种在JavaScript中检测函数是否通过new关键字调用的方法:usestrict模式、instanceof、constructor属性和new.target。每种方法展示了其在普通调用和new调用时的不同行为。
342

被折叠的 条评论
为什么被折叠?



