前言
JavaScript 中的 instanceof 运算符用于检查一个对象是否是某个构造函数的实例。关于instanceof方法可以前往往期文章JavaScript中的类型判断(二)—— instanceof与Object.prototype.toString.call()进行阅读。在本文中,我们将手动实现一个类似于 instanceof 的功能,即 myInstance 函数。这个函数接受两个参数 L 和 R,分别表示被比较对象和目标构造函数。
实现思路
我们可以通过以下几个步骤来实现 myInstance 函数:
- 首先,将被比较对象
L的隐式原型(即__proto__)赋值给变量left。 - 将目标构造函数
R的原型赋值给变量right。 - 进入一个循环,循环条件为
left不为null。在每次循环中,首先判断left是否与right相等,如果相等,则表示L是R的实例,返回true。 - 如果当前的
left不等于right,则将left更新为其自身的隐式原型(即left = left.__proto__),继续下一次循环。 - 当循环结束时,如果仍未找到匹配,则表示
L不是R的实例,返回false。
示例
console.log(myInstance([], Array)); // true
console.log(myInstance({}, Array)); // false
console.log(myInstance([], Object)); // true
第一个例子中,空数组 [] 是 Array 构造函数的实例,因此返回 true。
第二个例子中,空对象 {} 不是 Array 构造函数的实例,因此返回 false。
第三个例子中,空数组 [] 同样也是 Object 构造函数的实例,因为 Array 继承自 Object,所以返回 true。
完整代码
下面是完整的 myInstance 函数代码:
function myInstance(L, R) {
let left = L.__proto__;
let right = R.prototype;
//一直往下面找实例对象的隐式原型,直达到null才截至
while (left !== null) {
if (left === right) {
return true;
}
left = left.__proto__;
}
return false;
}
总结
本文介绍了如何手动实现类似于 instanceof 的功能。通过实现 myInstance 函数,我们更深入地理解了 JavaScript 中原型链和对象关系的工作方式。当面试官问到我们是否了解 instanceof 运算符时,我们可以用这个函数来展示我们对 JavaScript 原型链的理解和运用能力。
该系列往期文章: