首先看一下instanceof的用法。
a instanceof B 判断的是,a是否为B的实例,即a的原型链上是否存在B的构造函数。
function Person(name) {
this.name = name
}
const p = new Person('mike')
p instanceof Person // true
这里的 p 是 Person 构造出来的实例对象。
p.__proto__ === Person.prototype // true
同时,顺着 p 的原型链也能找到 Object 的构造函数。
p.__proto__.__proto__ === Object.prototype // true
这里暂且停顿一下,
好好回味一下“顺着~原型链 找 构造函数”这句话,
真正理解后对我们模拟instanceof的实现很有帮助。
const instanceofMock = (L, R) => {
if (typeof L !== 'object') {
// 注意:基本类型不是构造函数构造出来的实例对象
// 5 instanceof Number 结果为false
// new Number(5) instanceof Number 结果为true
return false
}
while (true) {
if (L === null) {
// 已经遍历到了顶端还是没找到
return false
}
if (R.prototype === L.__proto__) {
return true
}
// 找不到就继续顺着原型链往上找
L = L.__proto__
}
}
instanceofMock('', String) // false
instanceofMock(new String(''), String) // true
function Person(name) {
this.name = name
}
const p = new Person('mike')
instanceofMock(p, Person) // true
191

被折叠的 条评论
为什么被折叠?



