关键词:原型链相关知识
要判断一个对象是否为空,并且考虑到对象自身及其原型链上是否有自定义数据或方法,您可以使用以下的 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