instanceOf 用于检测构造函数的原型是否出现在某个实例对象的原型链上
- 遍历实例对象的原型链,找是否有和构造函数的原型相等的原型,直到最顶层Object还找不到,那么就返回false。
- 递归实现
let fn = function(){}
let p1 = new fn()
/*
1. obj :实例对象
2. func : 构造函数
*/
const defineInstanceOfByRecursive=(obj,func)=>{
// 判断是否找到Object顶层
if(obj === null || typeof obj !=='object'){
return false
}
// 获得示例对象原型链中的原型属性
const proto = Object.getPrototypeOf(obj)
//如果示例对象中原型链中的原型属性等于构造函数的原型属性返回true,顶层仍旧没有返回fasle
if(proto === func.prototype){
return true
}else if(proto === null){
return false
}else{
defineInstanceOfByRecursive(proto,func)
}
}
console.log(defineInstanceOfByRecursive(p1,fn)) // true
- 遍历实现
// Object.getPrototypeOf() 返回对象的原型
const defineInstanceOfByTraverse=(obj,func)=>{
if(obj === null || typeof obj !== 'object'){
return false
}
let proto = obj
while(proto = Object.getPrototypeOf(proto)){
if(proto === func.prototype){
return true
}
}
return false
}
console.log(defineInstanceOfByRecursive(p1,fn)) // true