如何仅用prototype、__proto__、constructor解决LeetCode 2618实例判断问题
LeetCode 2618题:不用循环和instanceof实现实例判断
问题分析
要判断对象是否为某个类(或父类)的实例,限制只能用prototype、__proto__、constructor这类属性,不能用while循环和instanceof。
你之前代码的问题
- 第一种写法:
return obj.constructor.prototype === classFunction.prototype
这个逻辑只能判断直接构造函数的实例,完全不支持继承场景。比如子类实例的constructor指向子类,子类的prototype.__proto__才是父类的prototype,这种情况下判断会直接返回false,但实际上子类实例属于父类的实例。另外如果对象的constructor被手动修改过,这个判断也会失效。
- 第二种写法:
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
相关产品推荐
相关产品推荐

