# instanceOf
# 定义
instanceof
运算符用于测试构造函数的prototype
属性是否出现在对象的原型链中的任何位置。 —— MDN
简单理解为:instanceof
可以检测一个实例是否属于某种类型。
function Foo(){}
const a = new Foo()
a instanceof Foo // true
a instanceof Object // true
还可以在继承关系中用来判断一个实例是否属于它的父类型。
function Foo(){}
function Child(){}
function Other(){}
Child.prototype = new Foo // 继承原型
const b = new Child()
b instanceof Foo // true
b instanceof Child // true
b instanceof Other // false
b instanceof Object // true
# 实现
查看对象B
的prototype
指向的对象是否在对象A
的[[prototype]]
链上。
如果在,则返回true
,如果不在则返回false
。不过有一个特殊的情况,当对象B
的prototype
为null
将会报错(类似于空指针异常)。
函数模拟 A instanceof B:
/**
* @param obj{Object} 测试对象
* @param fun{Function} 构造函数
*/
function instanceOf(A, B) {
let obj = A.__proto__
let fn = B.prototype
while (true) {
if (obj === null) return false
// 这里重点:当 fn 严格等于 obj 时,则返回 true
if (fn === obj) return true
obj = obj.__proto__
}
}
← 实现bind函数 new 原理及模拟实现 →