跳至主要內容

2618. 检查是否是类的对象实例


2618. 检查是否是类的对象实例open in new window

🟠   🔗 力扣open in new window LeetCodeopen in new window

题目

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。

解题思路

核心原理是通过遍历对象的原型链,逐步向上查找该对象的构造函数是否与给定的类(构造函数)相匹配。

  1. 初始化检查:在 while 循环中,检查 obj 是否为 null,若为 null 则退出循环。null 表示已到达原型链的顶端,意味着没有找到匹配的构造函数。

  2. 比较构造函数:通过 obj.constructor 获取当前对象的构造函数。如果 obj.constructor 与给定的 classFunction 相等,则说明 obj 是该类的实例,返回 true

  3. 遍历原型链:如果当前 obj 的构造函数不匹配,通过 Object.getPrototypeOf(obj) 获取其原型,然后继续向上查找,重复上一步骤。

  4. 终止条件:若原型链到达顶端仍未找到匹配的构造函数,则返回 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
 */