2618. 检查是否是类的对象实例
题目描述
请你编写一个函数,检查给定的值是否是给定类或超类的实例。
可以传递给函数的数据类型没有限制。例如,值或类可能是 undefined 。
示例 1:
输入:func = () => checkIfInstance(new Date(), Date) 输出:true 解释:根据定义,Date 构造函数返回的对象是 Date 的一个实例。
示例 2:
输入:func = () => { class Animal {}; class Dog extends Animal {}; return checkIfInstance(new Dog(), Animal); }
输出:true
解释:
class Animal {};
class Dog extends Animal {};
checkIfInstanceOf(new Dog(), Animal); // true
Dog 是 Animal 的子类。因此,Dog 对象同时是 Dog 和 Animal 的实例。 示例 3:
输入:func = () => checkIfInstance(Date, Date) 输出:false 解释:日期的构造函数在逻辑上不能是其自身的实例。
示例 4:
输入:func = () => checkIfInstance(5, Number) 输出:true 解释:5 是一个 Number。注意,"instanceof" 关键字将返回 false。
解法
方法一
思考
题目要求判断对象是否位于构造函数的原型链上,且须覆盖基本类型装箱、null/undefined 等边界。直接写 obj instanceof classFunction 在基本类型上会失败,也不处理非法构造函数。
沿 Object.getPrototypeOf 上溯即可复现 instanceof 的判定:一旦原型等于 classFunction.prototype 则成立。构造函数缺失时直接返回假。
因此先拒绝空的 classFunction,再循环提升原型直至尽头。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |