instanceof 是用于检测对象的原型链上是否与检测函数的 prototype
原型是否是同一引用。
那么是不是我在一个对象的 __proto__
上指向检测函数的 prototype
,那么经过 instanceof
检测之后是否就会返回 true
了呢?那我们来试试:
function mine() {}
mine.prototype.name = 'razzh'
var obj = {}
obj.__proto__ = mine.prototype
console.log(obj instanceof mine) // true
js
可以看到上述结果返回了 true
证实了这个猜想,接下来就依据它来实现一下 instanceof
。
#实现
思路:
1、获取检测对象的原型链
2、循环对象的原型链与函数的原型进行全等对比,若符合 if 分支条件则返回 true,反之 false
fucntion _myInstanceof(target, origin) {
if (typeof target !== 'object') throw Error('target must be Object')
if (typeof origin !== 'function') throw Error('origin must be origin')
let proto = Object.getPrototypeOf(target) // 相当于 proto = target.__proto__
while (proto) {
if (proto === origin.prototype) return true
proto = Object.getPrototypeOf(proto.prototype)
}
return false
}
js