实现instanceof
# 实现instanceof
instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。
关键点: 构造函数Fn的prototype,实例对象的原型链。
所以只要遍历实例对象的原型链,挨个往上查找看是否有与Fn的prototype相等的原型,直到最顶层Object还找不到,那么就返回false。
你能用多种方案实现吗?
instanceof的底层实现原理:
作用:
- 用于判断某个实例是否属于某构造函数
- 在继承关系中用来判断一个实例是否属于它的父类或者祖先类型的实例
只要右边变量的prototype在左边变量的原型链上即可。instanceof在查找的过程中会遍历左边变量的原型链,直到找到右边变量的prototype,如果查找失败,则会返回false。
- object某个实例对象
- constructor某个构造函数
- 功能 instanceof 运算符用于监测构造函数的 prototype 属性是否出现在某个实例对象的原型链
- 原理 内部机制是通过原型链实现的
- 用途:监测数据类型;判断一个引用类型变量是否是一个类的实例
function abc() {}
console.log(typeof abc); // function
let bool = true;
console.log(typeof bool); // boolean
let num = 12;
console.log(typeof num); // number
let str = 'str';
console.log(typeof str); // string
let unde;
console.log(typeof unde); // undefined
let nu = null;
console.log(typeof nu); // object
let obj = {};
console.log(typeof obj); // object
// typeof只能判断六种类型,即function、object、undefined、string、boolean、number。
// 对象 instanceof 构造函数
// var obj = new Object()
// obj instanceof Object // true
function myInstanceof (L, R) {
if(L === null || typeof L !== 'object' || typeof R !== 'function') {
return false;
}
// L实例对象
// R构造函数
let O = R.prototype;
// 取L的隐式原型
L = Object.getPrototypeOf(L);
while(true) {
// 循环遍历
if(!L) return false;
if(O === L) return true;
L = Object.getPrototypeOf(L);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42