力扣刷题:检查是否是类的对象实例

160 阅读2分钟

前言:锻炼自己的思想,规范自己的编程思路。

问题:

请你编写一个函数,检查给定的值是否是给定类或超类的实例。

可以传递给函数的数据类型没有限制。例如,值或类可能是 undefined

示例:(放代码里面)

输入: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 的实例。

思路:

题目给出的函数名为 checkIfInstanceOf 的函数,它用于检查给定的值 obj 是否是给定类 classFunction 或其超类的实例。

函数接受两个参数:obj 是要检查的值,classFunction 是要检查的类。

函数首先检查 obj 和 classFunction 是否为 null 或 undefined,如果是,则返回 false。

接下来,函数使用一个循环来遍历 obj 的原型链。在每次迭代中,函数检查 obj.__proto__是否等于 classFunction.prototype。如果是,则返回 true。否则,将 obj 设置为其原型对象,并继续循环。

如果循环结束后仍未找到匹配的原型对象,则返回 false。

需要注意的是,这段代码使用了非标准的 proto 属性来访问对象的原型。这个属性并不是所有浏览器都支持的,因此不建议在生产环境中使用。如果你想要访问对象的原型,可以使用标准的 Object.getPrototypeOf() 方法。

基于上述思考,代码如下:

/**
 * @param {any} obj
 * @param {any} classFunction
 * @return {boolean}
 */
var checkIfInstanceOf = function(obj, classFunction) {
    if (obj === null || classFunction === null || obj === undefined || classFunction === undefined) {
        return false;
    }
    while (obj.__proto__ !== null) {
        if (obj.__proto__ === classFunction.prototype) {
            return true;
        } else {
            obj = obj.__proto__;
        }
    }
    return false;
};
/**
 * checkIfInstanceOf(new Date(), Date); // true
 */

执行结果如下图:

image-20230624223258596.png

学到的知识:

instanceof 是 JavaScript 中的一个二元运算符,用于检查一个对象是否是一个类的实例,或者是否是该类的超类的实例。它返回一个布尔值,表示测试结果。