Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

LeetCode题解:2618. 检查是否是类的对象实例,迭代和递归 #489

Open
chencl1986 opened this issue Nov 21, 2024 · 0 comments

Comments

@chencl1986
Copy link
Owner

原题链接:
https://leetcode.cn/problems/check-if-object-instance-of-class/

解题思路:

我们可以使用 JavaScript 的原型链来检查一个对象是否是一个类的实例。在 JavaScript 中,每个对象都有一个内部属性 [[Prototype]],可以通过 __proto__ 属性来访问。一个对象的 __proto__ 属性指向了创建它的构造函数的 prototype 属性。因此,我们可以通过比较 obj.__proto__classFunction.prototype 是否相等来检查 obj 是否是 classFunction 的实例。如果不相等,我们就将 obj 设置为 obj.__proto__,然后继续比较,直到 obj.__proto__null

迭代版本:

/**
 * @param {any} obj - 需要检查的对象
 * @param {any} classFunction - 需要检查的类
 * @return {boolean} - 如果 obj 是 classFunction 的实例,则返回 true,否则返回 false
 */
var checkIfInstanceOf = function(obj, classFunction) {
  // 如果 obj 或 classFunction 是 null 或 undefined,那么我们可以直接返回 false
  if (
    obj === null ||
    obj === undefined ||
    classFunction === null ||
    classFunction === undefined
  ) {
    return false
  }

  // 使用 while 循环遍历 obj 的原型链
  while (obj.__proto__) {
    // 如果 obj.__proto__ 等于 classFunction.prototype,那么 obj 是 classFunction 的实例
    if (obj.__proto__ === classFunction.prototype) {
      return true
    }

    // 将 obj 设置为它的原型,然后继续循环
    obj = obj.__proto__
  }

  // 如果遍历完整个原型链都没有找到 classFunction.prototype,那么 obj 不是 classFunction 的实例
  return false
};

递归版本:

/**
 * @param {any} obj - 需要检查的对象
 * @param {any} classFunction - 需要检查的类
 * @return {boolean} - 如果 obj 是 classFunction 的实例,则返回 true,否则返回 false
 */
var checkIfInstanceOf = function(obj, classFunction) {
  // 如果 obj 或 classFunction 是 null 或 undefined,那么我们可以直接返回 false
  if (
    obj === null ||
    obj === undefined ||
    classFunction === null ||
    classFunction === undefined
  ) {
    return false
  }

  // 如果 obj.__proto__ 等于 classFunction.prototype,那么 obj 是 classFunction 的实例
  if (obj.__proto__ === classFunction.prototype) {
    return true
  }

  // 如果 obj.__proto__ 不等于 classFunction.prototype,那么我们递归地检查 obj.__proto__ 是否是 classFunction 的实例
  return checkIfInstanceOf(obj.__proto__, classFunction)
};

这两种解法都可以处理各种类型的值和类,包括原始类型的值和它们的包装对象,以及自定义的类和它们的实例。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant