手动实现 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
的工作原理。