推荐答案
// www.javascriptcn.com code example
function myInstanceof(left, right) {
// 基本类型直接返回 false
if (typeof left !== 'object' || left === null) {
return false;
}
// 获取 left 的原型对象
let proto = Object.getPrototypeOf(left);
while (true) {
// 如果原型链到头了,返回 false
if (proto === null) {
return false;
}
// 如果找到了 right 的原型,返回 true
if (proto === right.prototype) {
return true;
}
// 继续向上查找原型链
proto = Object.getPrototypeOf(proto);
}
}本题详细解读
1. 基本思路
myInstanceof 函数的核心思想是通过遍历 left 对象的原型链,检查是否存在与 right.prototype 相等的原型对象。如果找到,则返回 true,否则返回 false。
2. 代码解析
基本类型判断:首先判断
left是否为对象类型,如果不是对象类型或者为null,则直接返回false。因为基本类型(如number,string,boolean等)不可能是某个构造函数的实例。原型链遍历:通过
Object.getPrototypeOf(left)获取left的原型对象,然后进入一个while循环,不断向上查找原型链。终止条件:如果遍历到原型链的顶端(即
proto为null),则返回false。如果在遍历过程中找到了与right.prototype相等的原型对象,则返回true。
3. 示例
function Person() {}
const person = new Person();
console.log(myInstanceof(person, Person)); // true
console.log(myInstanceof(person, Object)); // true
console.log(myInstanceof(person, Array)); // false在这个示例中,person 是 Person 的实例,同时也是 Object 的实例,但不是 Array 的实例。