Object.getOwnPropertyDescriptor()

Baseline 已广泛支持

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2015 年 7 月⁩以来,各浏览器均已提供此特性。

静态方法 Object.getOwnPropertyDescriptor() 返回一个描述给定对象上特定属性的配置的对象(即,直接存在于对象上,不在对象的原型链上的属性)。返回的对象是可变的,但修改它不会影响原始属性的配置。

试一试

const object = {
  foo: 42,
};

const descriptor = Object.getOwnPropertyDescriptor(object, "foo");

console.log(descriptor.configurable);
// Expected output: true

console.log(descriptor.value);
// Expected output: 42

语法

js
Object.getOwnPropertyDescriptor(obj, prop)

参数

obj

要在其中查找属性的对象。

prop

要检索其描述的属性的名称或 Symbol

返回值

如果给定属性存在于对象上,则返回该属性的属性描述符,否则返回 undefined

描述

此方法允许检查属性的精确描述。JavaScript 中的属性由一个字符串值名称或一个 Symbol 和一个属性描述符组成。有关属性描述符类型及其属性的更多信息,请参见 Object.defineProperty()

属性描述符是一个包含以下部分或全部属性的记录:

value

与属性相关联的值(仅限数据描述符)。

可写

当且仅当与属性相关联的值可以被更改时为 true(仅限数据描述符)。

get

一个用作属性的 getter 函数,如果没有 getter 则为 undefined(仅限访问器描述符)。

set

一个用作属性的 setter 函数,如果没有 setter 则为 undefined(仅限访问器描述符)。

可配置

当且仅当此属性描述符的类型可以更改,并且该属性可以从相应对象中删除时为 true

可枚举

当且仅当此属性出现在相应对象上的属性枚举中时为 true

示例

使用 Object.getOwnPropertyDescriptor()

js
let o, d;

o = {
  get foo() {
    return 17;
  },
};
d = Object.getOwnPropertyDescriptor(o, "foo");
console.log(d);
// {
//   configurable: true,
//   enumerable: true,
//   get: [Function: get foo],
//   set: undefined
// }

o = { bar: 42 };
d = Object.getOwnPropertyDescriptor(o, "bar");
console.log(d);
// {
//   configurable: true,
//   enumerable: true,
//   value: 42,
//   writable: true
// }

o = { [Symbol.for("baz")]: 73 };
d = Object.getOwnPropertyDescriptor(o, Symbol.for("baz"));
console.log(d);
// {
//   configurable: true,
//   enumerable: true,
//   value: 73,
//   writable: true
// }

o = {};
Object.defineProperty(o, "qux", {
  value: 8675309,
  writable: false,
  enumerable: false,
});
d = Object.getOwnPropertyDescriptor(o, "qux");
console.log(d);
// {
//   value: 8675309,
//   writable: false,
//   enumerable: false,
//   configurable: false
// }

非对象强制类型转换

在 ES5 中,如果此方法的第一个参数不是对象(原始类型),它将导致 TypeError。在 ES2015 中,第一个参数为非对象时,首先会被强制转换为对象。

js
Object.getOwnPropertyDescriptor("foo", 0);
// TypeError: "foo" is not an object  // ES5 code

Object.getOwnPropertyDescriptor("foo", 0);
// Object returned by ES2015 code: {
//   configurable: false,
//   enumerable: true,
//   value: "f",
//   writable: false
// }

规范

规范
ECMAScript® 2026 语言规范
# sec-object.getownpropertydescriptor

浏览器兼容性

另见