You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅用prototype、__proto__、constructor解决LeetCode 2618实例判断问题

LeetCode 2618题:不用循环和instanceof实现实例判断

问题分析

要判断对象是否为某个类(或父类)的实例,限制只能用prototype、__proto__、constructor这类属性,不能用while循环和instanceof。

你之前代码的问题

  1. 第一种写法:
return obj.constructor.prototype === classFunction.prototype

这个逻辑只能判断直接构造函数的实例,完全不支持继承场景。比如子类实例的constructor指向子类,子类的prototype.__proto__才是父类的prototype,这种情况下判断会直接返回false,但实际上子类实例属于父类的实例。另外如果对象的constructor被手动修改过,这个判断也会失效。

  1. 第二种写法:
if (classFunction === Number || classFunction === String || classFunction === Date) {
        return obj.__proto__ === classFunction.prototype
    } else return obj.__proto__.constructor.__proto__.prototype === classFunction.prototype
  • 仅针对几个内置类做判断,通用性极差;
  • 后半段逻辑完全错误:obj.__proto__.constructor是当前类本身,类的__proto__是Function.prototype,它的prototype和目标类没有任何关联,根本无法正确判断继承关系。

可行实现方案

核心思路是模拟instanceof的原型链检查逻辑,用递归代替while循环遍历原型链(毕竟你只禁止了while循环,没限制递归),同时处理边界情况:

function checkInstanceOf(obj, classFunction) {
    // 处理null/undefined或非对象/非函数的基本类型(比如1、'abc'这类,它们不是包装对象的话不算实例)
    if (obj === null || (typeof obj !== 'object' && typeof obj !== 'function')) {
        return false;
    }
    // 当前原型匹配目标类的prototype,直接返回true
    if (obj.__proto__ === classFunction.prototype) {
        return true;
    }
    // 递归检查原型链的上一级
    return checkInstanceOf(obj.__proto__, classFunction);
}

说明

  • 这个实现完全依赖__proto__和prototype属性,没有用while循环和instanceof;
  • 能正确处理继承场景:比如子类实例会沿着原型链递归检查到父类的prototype;
  • 自动过滤了非对象的基本类型,符合instanceof的原生行为(比如1 instanceof Number返回false,但new Number(1) instanceof Number返回true)。

内容的提问来源于stack exchange,提问作者ioneluoooo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 13:35:12