# 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

# 实现

查看对象Bprototype指向的对象是否在对象A[[prototype]]链上。

如果在,则返回true,如果不在则返回false。不过有一个特殊的情况,当对象Bprototypenull将会报错(类似于空指针异常)。

函数模拟 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__
    }
}