object.getownpropertydescriptor用于获取对象自有属性的完整描述符,返回包含value/writable/enumerable/configurable或get/set等字段的对象;若属性不存在或为继承属性则返回undefined。

Object.getOwnPropertyDescriptor 用于获取对象**自有属性**(非继承)的完整描述符,返回一个包含 value、writable、enumerable、configurable 等字段的对象;如果属性不存在或为继承属性,则返回 undefined。
基本用法:获取单个属性的描述符
语法很简单:Object.getOwnPropertyDescriptor(obj, prop),第一个参数是目标对象,第二个是属性名(字符串)。
- 只查自有属性 —— 即使原型链上有同名属性,也不会返回它
- 属性必须存在且是直接定义在该对象上的,否则返回
undefined - 对访问器属性(get/set)也有效,此时返回
get、set函数,而不是value
例如:
const obj = { a: 1 };
Object.defineProperty(obj, 'b', {
value: 2,
writable: false,
enumerable: true,
configurable: false
});
Object.getOwnPropertyDescriptor(obj, 'a');
// → { value: 1, writable: true, enumerable: true, configurable: true }
Object.getOwnPropertyDescriptor(obj, 'b');
// → { value: 2, writable: false, enumerable: true, configurable: false }
Object.getOwnPropertyDescriptor(obj, 'toString'); // undefined(继承属性)
区分数据属性和访问器属性
描述符有两种类型:数据描述符(含 value 和 writable)和访问器描述符(含 get 和 set)。两者不能共存,get/set 存在时 value/writable 就不会出现。
- 数据属性:返回对象中包含
value字段,通常还有writable - 访问器属性:返回对象中包含
get或set(或两者),没有value - 可通过
'get' in descriptor或typeof descriptor.get === 'function'判断是否为访问器
示例:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
const obj = {
get x() { return this._x || 0; },
set x(val) { this._x = val; }
};
Object.getOwnPropertyDescriptor(obj, 'x');
// → { get: ƒ, set: ƒ, enumerable: true, configurable: true }
配合 Object.getOwnPropertyDescriptors 批量查看
如果想一次看清楚对象所有自有属性的描述符,用 Object.getOwnPropertyDescriptors(obj) 更高效。它返回一个键值对对象,每个值都是对应属性的描述符。
- 适合调试对象的可枚举性、是否可配置等细节
- 常用于深拷贝、属性重定义(如
Object.defineProperties的输入源) - 注意:仍不包含继承属性,只处理自有属性
例如:
const obj = { a: 1 };
Object.defineProperty(obj, 'b', { value: 2, writable: false });
Object.getOwnPropertyDescriptors(obj);
// → { a: { value: 1, writable: true, enumerable: true, configurable: true },
// b: { value: 2, writable: false, enumerable: true, configurable: true } }
常见陷阱与注意事项
容易出错的地方往往不在语法,而在语义理解上:
-
不可枚举属性也能被查到 ——
enumerable: false只影响for...in和Object.keys(),不影响getOwnPropertyDescriptor -
严格模式下对不可写属性赋值会报错,但
getOwnPropertyDescriptor只是“看”,不会触发任何副作用 - Symbol 属性同样支持,只需把 Symbol 作为第二个参数传入
- Proxy 对象需谨慎 —— 原生 Proxy 的
getOwnPropertyDescriptortrap 必须返回合法描述符,否则会抛错
比如查看 Symbol 属性:
const sym = Symbol('key');
const obj = { [sym]: 'value' };
Object.getOwnPropertyDescriptor(obj, sym);
// → { value: 'value', writable: true, enumerable: true, configurable: true }
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










