Object.getOwnPropertyDescriptors用于获取对象自身所有字符串属性的完整描述符,包括value、writable、enumerable、configurable及get/set;不包含Symbol属性,也不继承原型链属性;常与Object.defineProperties配合实现保真复制。

Object.getOwnPropertyDescriptors 用于一次性获取对象**自身所有属性**的完整描述符(descriptor),包括 value、writable、enumerable、configurable,以及 get 和 set(如果是访问器属性)。它不继承原型链上的属性,只返回对象“自己拥有”的那些。
获取对象自身所有属性的描述符
直接传入目标对象,返回一个以属性名为键、描述符对象为值的新对象:
const obj = {
a: 1,
get b() { return 2; },
set c(v) { this._c = v; }
};
Object.defineProperty(obj, 'd', {
value: 4,
writable: false,
enumerable: true,
configurable: false
});
const descriptors = Object.getOwnPropertyDescriptors(obj);
// 返回:
// {
// a: { value: 1, writable: true, enumerable: true, configurable: true },
// b: { get: [Function: b], set: undefined, enumerable: true, configurable: true },
// c: { get: undefined, set: [Function: c], enumerable: true, configurable: true },
// d: { value: 4, writable: false, enumerable: true, configurable: false }
// }
常用于对象浅拷贝并保留属性特性
配合 Object.defineProperties 可以精确复制对象(包括不可写、不可枚举、不可配置等特性),比 Object.assign 更完整:
-
Object.assign只复制[[Value]],会丢失writable、enumerable等元信息 - 用
Object.getOwnPropertyDescriptors+Object.defineProperties才能真正“保真”复制
示例:
立即学习“Java免费学习笔记(深入)”;
const original = { x: 1 };
Object.defineProperty(original, 'y', {
value: 2,
writable: false,
enumerable: false
});
const clone = {};
Object.defineProperties(clone, Object.getOwnPropertyDescriptors(original));
// clone.y 存在但不可写、不可枚举,和 original 完全一致
与 Object.keys / Object.getOwnPropertyNames 的区别
三者都只查对象自身的属性,但范围不同:
-
Object.keys(obj):只返回enumerable === true的自有字符串键 -
Object.getOwnPropertyNames(obj):返回所有自有字符串键(含enumerable: false) -
Object.getOwnPropertyDescriptors(obj):返回所有自有字符串键 + 对应的完整描述符(含访问器、writable 等)
注意:三者都**不包含 Symbol 属性**;如需处理 Symbol,需配合 Object.getOwnPropertySymbols 单独获取。
处理 Symbol 属性需要额外步骤
Object.getOwnPropertyDescriptors 默认忽略 Symbol 属性。若对象含 Symbol 键,需手动合并:
const obj = {
regular: 'a'
};
const sym = Symbol('test');
obj[sym] = 'b';
Object.defineProperty(obj, sym, { writable: false });
const descriptors = Object.getOwnPropertyDescriptors(obj);
const symbolKeys = Object.getOwnPropertySymbols(obj);
symbolKeys.forEach(symKey => {
descriptors[symKey] = Object.getOwnPropertyDescriptor(obj, symKey);
});
// 此时 descriptors 包含字符串键和 Symbol 键的全部描述符


















