【模拟实现】instanceof
williamzhou 3/26/2021 面试模拟实现原型链
# 原理
MDN定义 - instanceof (opens new window)
instanceof
运算符用于检测构造函数的prototype
属性是否出现在某个实例对象的原型上。
# 实现思路
遍历左边变量的原型链,直到找到右边变量的 prototype,如果没有找到,返回 false
# 代码实现(函数形式)
/**
* instanceof 函数
* @param {Object} left 某变量
* @param {Function} right 某构造函数
*/
function myInstanceofFn (left, right) {
// 值类型变量
if (left == null) return false
if (['boolean', 'string', 'number'].indexOf(typeof left) > -1) return false
let lProto = left.__proto__
const target = right.prototype
while (lProto) {
if (lProto === target) return true
lProto = lProto.__proto__
}
return false
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 测试一下
分别测试构造函数不同返回值情况
// 测试值类型
console.log( // false
myInstanceofFn(Object.create(null), Object),
Object.create(null) instanceof Object
)
console.log( // false
myInstanceofFn('abc', Object),
'abc' instanceof Object
)
// 测试引用类型
console.log( // true
myInstanceofFn(Array, Object),
Array instanceof Object
)
console.log( // true
myInstanceofFn(Function, Object),
Function instanceof Object
)
console.log( // true
myInstanceofFn(new String('abc'), String),
new String('abc') instanceof String
)
console.log( // true
myInstanceofFn(new String('abc'), Object),
new String('abc') instanceof Object
)
console.log( // false
myInstanceofFn(new String('abc'), Array),
new String('abc') instanceof Array
)
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
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