object.getownpropertydescriptors 是一个原生批量获取对象自有属性描述符的 api,直接返回包含所有字符串键名自有属性完整描述符的新对象,不遍历原型链、保留属性顺序、正确处理访问器与数据属性,但默认不包含 symbol 属性。

Object.getOwnPropertyDescriptors 本身就是一个批量获取属性描述符的 API,它直接返回对象所有自有属性(不含原型链上的)的完整描述符对象,无需额外“批量”封装。
它本身就是为批量获取设计的
调用 Object.getOwnPropertyDescriptors(obj) 会一次性返回一个新对象,其每个键对应 obj 的一个自有属性名,值是该属性的属性描述符(包含 value、writable、enumerable、configurable、get、set 等字段)。
- 只遍历对象自身属性,不访问原型链
- 保留原始属性顺序(ES2015+ 中对象属性枚举顺序有明确定义)
- 对访问器属性(
get/set)和数据属性都正确处理
常见使用场景示例
比如需要浅拷贝一个含访问器或特殊配置的对象:
const source = {
get foo() { return 'bar'; },
set baz(v) { this._baz = v; }
};
Object.defineProperty(source, 'qux', {
value: 42,
writable: false,
enumerable: true,
configurable: false
});
const descriptors = Object.getOwnPropertyDescriptors(source);
// descriptors 包含 foo(get)、baz(set)、qux(value + 配置)三个完整描述符
const copy = Object.defineProperties({}, descriptors);
// copy 精确复刻了 source 的所有属性行为
注意它不递归,也不处理 Symbol 属性?
默认只返回字符串键名的自有属性。如果对象还有 Symbol 类型的自有属性,需手动合并:
- 用
Object.getOwnPropertySymbols(obj)获取 Symbol 键数组 - 遍历这些 Symbol 键,用
Object.getOwnPropertyDescriptor(obj, sym)单独获取描述符 - 再把结果合并进
Object.getOwnPropertyDescriptors(obj)返回的对象中
不需要自己封装 for...in 或 Object.keys 循环
有人误以为要手动遍历 keys 再逐个调用 getOwnPropertyDescriptor,其实没必要:
-
Object.getOwnPropertyDescriptors内部已高效实现批量读取 - 比手写循环更简洁、更可靠(尤其对不可枚举属性)
- 避免遗漏不可枚举属性(
for...in和Object.keys都跳过它们)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











