关键词:原型链相关知识

要判断一个对象是否为空,并且考虑到对象自身及其原型链上是否有自定义数据或方法,您可以使用以下的 JavaScript 函数来实现:

 1function isObjectEmpty(obj) {
 2  // 首先获取对象自身的属性
 3  const ownProperties = Object.getOwnPropertyNames(obj);
 4
 5  // 遍历自身属性
 6  for (const property of ownProperties) {
 7    const descriptor = Object.getOwnPropertyDescriptor(obj, property);
 8    // 如果属性是数据属性并且有值,或者是方法(可调用函数),则对象不为空
 9    if (
10      (descriptor.value && descriptor.value !== null && descriptor.value !== undefined) ||
11      typeof descriptor.value === "function"
12    ) {
13      return false;
14    }
15  }
16
17  // 获取对象的原型
18  const prototype = Object.getPrototypeOf(obj);
19
20  // 如果有原型并且原型不是 `Object.prototype`(避免误判普通对象的默认方法)
21  while (prototype && prototype !== Object.prototype) {
22    const prototypeProperties = Object.getOwnPropertyNames(prototype);
23
24    // 遍历原型的属性
25    for (const property of prototypeProperties) {
26      const descriptor = Object.getOwnPropertyDescriptor(prototype, property);
27      // 如果原型上的属性是数据属性并且有值,或者是方法(可调用函数),则对象不为空
28      if (
29        (descriptor.value && descriptor.value !== null && descriptor.value !== undefined) ||
30        typeof descriptor.value === "function"
31      ) {
32        return false;
33      }
34    }
35
36    // 继续沿着原型链向上查找
37    prototype = Object.getPrototypeOf(prototype);
38  }
39
40  // 如果以上检查都没有找到非空属性或方法,则对象为空
41  return true;
42}

可以使用这个函数来判断对象是否为空,例如:

 1function MyClass() {}
 2
 3MyClass.prototype.myMethod = function () {};
 4
 5const instance = new MyClass();
 6
 7console.log(isObjectEmpty(instance));

另一种方式,使用reflect

 1function isObjectEmpty(obj) {
 2    return Reflect.ownKeys(obj).length === 0
 3}
个人笔记记录 2021 ~ 2025