Object.getOwnPropertyDescriptor用于获取对象自身属性的完整描述符,返回含value/writable或get/set等字段的对象,不查找原型链;属性不存在或obj为null/undefined时返回undefined。

Object.getOwnPropertyDescriptor 用于获取对象自身某个属性的完整描述符(descriptor),不包括原型链上的属性。它返回一个对象,包含该属性的 value、writable、enumerable、configurable 等元信息,是理解 JavaScript 属性特性与底层控制的关键方法。
基本语法和返回值结构
调用方式很简单:
Object.getOwnPropertyDescriptor(obj, prop)
其中 obj 是目标对象,prop 是要查询的属性名(字符串)。返回值是一个描述符对象,可能包含以下字段:
-
value:属性的值(仅适用于数据属性) -
writable:是否可修改(仅适用于数据属性) -
get:getter 函数(仅适用于访问器属性) -
set:setter 函数(仅适用于访问器属性) -
enumerable:是否可在for...in或Object.keys()中出现 -
configurable:是否可被删除或修改描述符本身
如果属性不存在,或对象为 null/undefined,返回 undefined。
立即学习“Java免费学习笔记(深入)”;
区分数据属性和访问器属性
描述符类型取决于属性如何定义:
- 普通赋值(如
obj.x = 1)创建的是数据属性,返回对象含value和writable - 用
Object.defineProperty设置了get或set,就是访问器属性,返回对象含get和/或set,不含value/writable
例如:
const obj = { a: 1 };
Object.defineProperty(obj, 'b', {
get() { return 2; },
enumerable: true
});
console.log(Object.getOwnPropertyDescriptor(obj, 'a')); // { value: 1, writable: true, enumerable: true, configurable: true }
console.log(Object.getOwnPropertyDescriptor(obj, 'b')); // { get: [Function], set: undefined, enumerable: true, configurable: true }
注意不可枚举和继承属性不会被返回
getOwnPropertyDescriptor 只查对象“自己”的属性,不查找原型链。即使属性在原型上存在且可枚举,也不会返回。
- 想查原型上的属性?需手动用
Object.getPrototypeOf(obj)获取原型再调用 - 想列出所有自身属性的描述符?可用
Object.getOwnPropertyNames(obj).map(key => Object.getOwnPropertyDescriptor(obj, key)) - 对
Symbol属性也有效,但需传入具体 symbol 值,不能用字符串
常见用途和实用场景
这个 API 常用于工具函数、框架响应式系统、深克隆或属性冻结逻辑中:
- 判断某属性是否只读:
!desc.writable === true - 判断是否为 getter:
typeof desc.get === 'function' - 复制属性时保留原始配置:
Object.defineProperty(target, key, desc) - 配合
Object.defineProperty实现属性重定义前的安全检查(比如确认configurable: true才能改)
不复杂但容易忽略。










