2618. 检查是否是类的对象实例
2618. 检查是否是类的对象实例
题目
Write a function that checks if a given value is an instance of a given class or superclass. For this problem, an object is considered an instance of a given class if that object has access to that class's methods.
There are no constraints on the data types that can be passed to the function. For example, the value or the class could be undefined
.
Example 1:
Input: func = () => checkIfInstanceOf(new Date(), Date)
Output: true
Explanation: The object returned by the Date constructor is, by definition, an instance of Date.
Example 2:
Input: func = () => { class Animal {}; class Dog extends Animal
Output: true
Explanation:
class Animal {};
class Dog extends Animal {};
checkIfInstanceOf(new Dog(), Animal); // true
Dog is a subclass of Animal. Therefore, a Dog object is an instance of both Dog and Animal.
Example 3:
Input: func = () => checkIfInstanceOf(Date, Date)
Output: false
Explanation: A date constructor cannot logically be an instance of itself.
Example 4:
Input: func = () => checkIfInstanceOf(5, Number)
Output: true
Explanation: 5 is a Number. Note that the "instanceof" keyword would return false. However, it is still considered an instance of Number because it accesses the Number methods. For example "toFixed()".
题目大意
请你编写一个函数,检查给定的值是否是给定类或超类的实例。
可以传递给函数的数据类型没有限制。例如,值或类可能是 undefined
。
示例 1:
输入: func = () => checkIfInstance(new Date(), Date)
输出: true
解释: 根据定义,Date 构造函数返回的对象是 Date 的一个实例。
示例 2:
输入: func = () => { class Animal {}; class Dog extends 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。
解题思路
核心原理是通过遍历对象的原型链,逐步向上查找该对象的构造函数是否与给定的类(构造函数)相匹配。
初始化检查:在
while
循环中,检查obj
是否为null
,若为null
则退出循环。null
表示已到达原型链的顶端,意味着没有找到匹配的构造函数。比较构造函数:通过
obj.constructor
获取当前对象的构造函数。如果obj.constructor
与给定的classFunction
相等,则说明obj
是该类的实例,返回true
。遍历原型链:如果当前
obj
的构造函数不匹配,通过Object.getPrototypeOf(obj)
获取其原型,然后继续向上查找,重复上一步骤。终止条件:若原型链到达顶端仍未找到匹配的构造函数,则返回
false
。
复杂度分析
- 时间复杂度:
O(k)
,其中k
为对象的原型链长度,最多需要遍历k
次才能找到匹配的构造函数或者到达原型链的顶端。 - 空间复杂度:
O(1)
,只使用了常数级别的额外空间来存储中间变量。
代码
/**
* @param {*} obj
* @param {*} classFunction
* @return {boolean}
*/
var checkIfInstanceOf = function (obj, classFunction) {
while (obj != null) {
if (obj.constructor == classFunction) {
return true;
}
obj = Object.getPrototypeOf(obj);
}
return false;
};
/**
* checkIfInstanceOf(new Date(), Date); // true
*/