instanceof是利用原型链来判断元素是否是某个构造函数的实例,原理是看构造函数的prototype是否在实例的原型链上。
当我们写 a instanceof F 时,JS 引擎在底层做的是链式查找:
-
先获取
F.prototype(构造函数的显式原型)。 -
然后获取
a的隐式原型(a.__proto__,即Object.getPrototypeOf(a))。 -
循环比较:
a的当前原型 ===F.prototype吗?如果不相等,就顺着链条往上走:a.__proto__.__proto__... -
如果链条最终指向了
null还没找到,返回false;一旦中途匹配,立即返回true。
代码
javascript
function myInstanceof(left, right) {
const prototype = right.prototype
let proto = Object.getPrototypeOf(left)
while (true) {
if (proto === null) return false
if (proto === prototype) return true
proto = Object.getPrototypeOf(proto)
}
}