object.getownpropertydescriptor用于获取对象自有属性的完整描述符,返回包含value、writable、enumerable、configurable等信息的对象或undefined;仅适用于自有属性,不查继承属性、数组索引(除非显式定义),且参数需为对象和字符串属性名。

Object.getOwnPropertyDescriptor 用于获取对象**自有属性**(非继承)的完整描述符,包括 value、writable、enumerable、configurable 等关键元信息。它不适用于访问器属性(如 get/set)以外的继承属性或数组索引(除非显式定义为数据属性)。
基本用法:传入对象和属性名
语法很简单:
Object.getOwnPropertyDescriptor(obj, prop)
返回一个描述符对象(如果属性存在且为自有属性),否则返回 undefined。
- 第一个参数必须是对象(原始值会自动包装,但通常无意义)
- 第二个参数是字符串形式的属性名(不能是 Symbol,除非用
Object.getOwnPropertyDescriptors配合Reflect.ownKeys) - 只查对象自身属性,原型链上的属性不会被返回
查看数据属性描述符
普通赋值创建的属性默认是可写、可枚举、可配置的:
const obj = { name: 'Alice' };
console.log(Object.getOwnPropertyDescriptor(obj, 'name'));
// 输出:
// {
// value: 'Alice',
// writable: true,
// enumerable: true,
// configurable: true
// }
若用 Object.defineProperty 自定义过属性,描述符会如实反映设置值:
Object.defineProperty(obj, 'age', {
value: 30,
writable: false,
enumerable: false,
configurable: false
});
console.log(Object.getOwnPropertyDescriptor(obj, 'age'));
// { value: 30, writable: false, enumerable: false, configurable: false }
区分数据属性和访问器属性
描述符类型由是否含 get/set 决定:
- 数据属性:含
value和writable - 访问器属性:含
get或set(不含value/writable)
例如:
const obj = {
_title: 'JS Guide',
get title() { return this._title; },
set title(v) { this._title = v; }
};
console.log(Object.getOwnPropertyDescriptor(obj, 'title'));
// {
// get: [Function: get title],
// set: [Function: set title],
// enumerable: true,
// configurable: true
// }
常见陷阱与注意事项
容易出错的地方:
- 对 undefined、null 调用会报错,需确保第一个参数是对象
- 对数组调用时,下标如
'0'只有在该索引被显式定义为自有属性时才返回描述符(普通数组元素是继承自 Array.prototype 的,不是自有属性) - 不可枚举属性(如通过
Object.defineProperty设置enumerable: false)仍能被getOwnPropertyDescriptor获取到 - 想一次看所有自有属性描述符?用
Object.getOwnPropertyDescriptors(obj)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











