前端/移动开发面试题更新 2026-08-05

请用 JavaScript 编写一个函数,用来模拟内置的 instanceof 操作符的判定逻辑,并给出具体实现代码。

前端/移动开发编码实现技术原理JavaScript

考察说明

考查对 JavaScript 原型链机制的理解,以及能否用代码复现 instanceof 的判定过程。

回答思路

  1. 【回答框架 1】instanceof 操作符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。其核心原理是沿着对象的原型链逐层向上查找,直到找到与构造函数的 prototype 相等的原型对象,或者达到原型链顶端 null。
  2. 【回答框架 2】可以用循环实现:从当前对象的 __proto__ 开始,每次比较当前原型是否等于构造函数的 prototype,如果不相等则继续向上取 __proto__,直到原型为 null 时返回 false。代码实现中需要先用 Object.getPrototypeOf 获取对象的原型,而不是直接访问 __proto__,以保证兼容性,并需处理非对象的情况。
  3. 【回答框架 3】实现还需考虑边界条件:如果实例不是对象(比如基本类型),应返回 false;如果构造函数没有 prototype 属性(如箭头函数),应返回 false 或抛出错误。
  4. 【回答框架 4】最终代码为:function myInstanceof(instance, constructor) { if (typeof instance !== 'object' || instance === null) return false; let proto = Object.getPrototypeOf(instance); while (proto !== null) { if (proto === constructor.prototype) return true; proto = Object.getPrototypeOf(proto); } return false; }
  5. 【关键点 1】instanceof 检查的是构造函数的 prototype 是否在实例的原型链上。
  6. 【关键点 2】使用 Object.getPrototypeOf 获取原型,避免依赖 __proto__。
  7. 【关键点 3】循环条件必须处理原型链终点 null,防止死循环。
  8. 【关键点 4】非对象实例直接返回 false。
  9. 【易错点 1】误以为 instanceof 检查的是构造函数本身,而实际是其 prototype 属性。
  10. 【易错点 2】忽略对 instance 为基本类型的检查,可能导致错误结果或异常。
  11. 【易错点 3】使用 __proto__ 而非 Object.getPrototypeOf,在严格模式或某些环境中可能有问题。