Object.getOwnPropertyDescriptor()

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

¥The Object.getOwnPropertyDescriptor() static method returns an object describing the configuration of a specific property on a given object (that is, one directly present on an object and not in the object's prototype chain). The object returned is mutable but mutating it has no effect on the original property's configuration.

Try it

语法

¥Syntax

js
Object.getOwnPropertyDescriptor(obj, prop)

参数

¥Parameters

obj

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

prop

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

返回值

¥Return value

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

¥A property descriptor of the given property if it exists on the object, undefined otherwise.

描述

¥Description

该方法允许检查属性的精确描述。JavaScript 中的属性由字符串值名称或 Symbol 和属性描述符组成。有关属性描述符类型及其属性的更多信息可以在 Object.defineProperty() 中找到。

¥This method permits examination of the precise description of a property. A property in JavaScript consists of either a string-valued name or a Symbol and a property descriptor. Further information about property descriptor types and their attributes can be found in Object.defineProperty().

属性描述符是具有以下一些属性的记录:

¥A property descriptor is a record with some of the following attributes:

value

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

writable

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

get

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

set

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

configurable

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

enumerable

true 当且仅当该属性在相应对象的属性枚举过程中出现时。

示例

¥Examples

使用 Object.getOwnPropertyDescriptor()

¥Using 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
// }

非对象强制

¥Non-object coercion

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

¥In ES5, if the first argument to this method is not an object (a primitive), then it will cause a TypeError. In ES2015, a non-object first argument will be coerced to an object at first.

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
// }

规范

Specification
ECMAScript Language Specification
# sec-object.getownpropertydescriptor

¥Specifications

浏览器兼容性

BCD tables only load in the browser

¥Browser compatibility

也可以看看