Object.getOwnPropertyDescriptors()

Baseline 已广泛支持

该特性已非常成熟,可在多种设备和浏览器版本上使用。自 2017 年 4 月以来,它已在各大浏览器上可用。

静态方法 Object.getOwnPropertyDescriptors() 返回给定对象的所有自身属性描述符。

试一试

const object = {
  foo: 42,
};

const descriptors = Object.getOwnPropertyDescriptors(object);

console.log(descriptors.foo.writable);
// Expected output: true

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

语法

js
Object.getOwnPropertyDescriptors(obj)

参数

obj

要获取所有自身属性描述符的对象。

返回值

一个包含对象所有自身属性描述符的对象。如果没有属性,可能是一个空对象。

描述

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

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

value

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

可写

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

get

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

set

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

可配置

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

可枚举

当且仅当此属性在相应对象的属性枚举期间显示时为 true

示例

创建浅拷贝

虽然 Object.assign() 方法只会将源对象的可枚举和自身属性复制到目标对象,但您可以使用此方法和 Object.create() 在两个未知对象之间实现 浅拷贝

js
Object.create(
  Object.getPrototypeOf(obj),
  Object.getOwnPropertyDescriptors(obj),
);

创建子类

创建子类的典型方法是定义子类,将其原型设置为超类实例,然后在该实例上定义属性。这可能会很麻烦,尤其是对于 getter 和 setter。相反,您可以使用此代码设置原型。

js
function superclass() {}
superclass.prototype = {
  // Define the superclass constructor, methods, and properties here
};
function subclass() {}
subclass.prototype = Object.create(superclass.prototype, {
  // Define the subclass constructor, methods, and properties here
});

规范

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

浏览器兼容性

另见