Object.getOwnPropertyDescriptor()

**Object.getOwnPropertyDescriptor()** 静态方法返回一个对象,该对象描述了给定对象上特定属性的配置(即,直接出现在对象上而不是在对象的原型链中的属性)。返回的对象是可变的,但对其进行修改不会影响原始属性的配置。

试试看

语法

js
Object.getOwnPropertyDescriptor(obj, prop)

参数

obj

要查找属性的对象。

prop

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

返回值

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

描述

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

属性描述符是包含以下某些属性的记录

value

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

writable

如果且仅当与属性关联的值可以更改时,则为true(仅数据描述符)。

get

充当属性获取器的函数,如果不存在获取器,则为undefined(仅访问器描述符)。

set

充当属性设置器的函数,如果不存在设置器,则为undefined(仅访问器描述符)。

configurable

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

enumerable

如果且仅当此属性在枚举相应对象上的属性时显示,则为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 语言规范
# sec-object.getownpropertydescriptor

浏览器兼容性

BCD 表格仅在启用 JavaScript 的浏览器中加载。

另请参阅