手写原理 | instanceof

MDN

instanceof 运算符用于检测构造函数的prototype属性是否出现在实例对象的原型链上

语法

1
object instancof constructor

参数

object:某个实例对象

constructor:某个构造函数

返回值

布尔值

手写实现

实现思路:根据原型链的思想,判断实例对象的__proto__是否指向构造函数的原型,一级一级向上判断,直至null

注意:instanceof只能用于判断引用数据类型,不能判断基本数据类型,直接返回false

1
2
3
4
5
6
7
8
9
10
11
12
13
function myInstanceOf(object, constructor) {
if (typeof object !== 'object' || object === null) return false;
let left = object.__proto__;
let right = constructor.prototype;
while (true) {
// 终止条件1:找到原型了
if (left === right) return true;
// 终止条件2:遍历到了尽头也没找到
if (left === null) return false;
// 还没找到:继续找呗!
left = left.__proto__;
};
};

测试

1
2
3
4
5
6
7
8
9
function Person(name, age) {
this.name = name;
this.age = age;
};

let p = new Person('KK', 18);

console.log(myInstanceOf(p, Person)); // true
console.log(myInstanceOf(p, Object)); // true

知识补充

手写Object.create

手写new