手动实现 JavaScript 中类似 instanceof 的功能

instanceof 是 JavaScript 中的一个操作符,用于检查一个对象是否是某个构造函数的实例。它的工作原理是通过检查对象的原型链,看是否存在该构造函数的 prototype 属性。
我们可以手动实现一个类似 instanceof 的功能,以下是一个实现:
function myInstanceof(obj, constructor) {
// 检查 obj 是否为对象或函数,且 constructor 必须是一个函数
if ((typeof obj !== 'object' && typeof obj !== 'function') || obj === null) {
return false;
}
if (typeof constructor !== 'function') {
throw new TypeError('Right-hand side of instanceof is not callable');
}
// 获取对象的原型
let proto = Object.getPrototypeOf(obj);
// 遍历原型链
while (proto !== null) {
// 如果找到了构造函数的 prototype,返回 true
if (proto === constructor.prototype) {
return true;
}
// 继续向上查找原型链
proto = Object.getPrototypeOf(proto);
}
// 如果遍历完原型链都没有找到,返回 false
return false;
}
// 示例用法
function Person() {}
const person = new Person();
console.log(myInstanceof(person, Person)); // true
console.log(myInstanceof(person, Object)); // true
console.log(myInstanceof(person, Array)); // false
代码解释:
-
类型检查:首先检查
obj是否为对象或函数,并且constructor必须是一个函数。如果obj是null或基本类型(如number、string等),则直接返回false。 -
获取原型:使用
Object.getPrototypeOf(obj)获取obj的原型。 -
遍历原型链:通过
while循环遍历原型链,直到找到constructor.prototype或者原型链的尽头(null)。 -
返回结果:如果在原型链中找到了
constructor.prototype,则返回true,否则返回false。
注意事项:
instanceof操作符不仅可以用于对象,还可以用于函数(因为函数也是对象)。instanceof操作符会检查整个原型链,因此如果一个对象继承自某个构造函数,instanceof也会返回true。
这个手动实现的 myInstanceof 函数可以很好地模拟 instanceof 的行为,并且可以用于理解 instanceof 的工作原理。