/

Object getOwnPropertyDescriptors()方法

Object getOwnPropertyDescriptors()方法

了解JavaScript Object对象的getOwnPropertyDescriptors()方法

此方法返回对象的所有自有(非继承)属性描述符。

Object.getOwnPropertyDescriptors(obj)接受一个对象,并返回一个提供属性描述符列表的新对象。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const dog = {}
Object.defineProperties(dog, {
breed: {
value: 'Siberian Husky'
}
})
Object.getOwnPropertyDescriptors(dog)
/\*
{
breed: {
value: 'Siberian Husky',
writable: false,
enumerable: false,
configurable: false
}
}
\*/

有一个使用场景可以非常有用。ES2015给我们提供了Object.assign(),它可以复制一个或多个对象的所有可枚举自有属性,并返回一个新对象。但是它存在一个问题,就是它无法正确复制具有非默认属性的属性。

例如,如果一个对象只有一个setter,使用Object.assign()无法正确复制到新对象中。例如:

1
2
3
4
5
const person1 = {
set name(newName) {
console.log(newName)
}
}

这个复制尝试将不起作用:

1
2
const person2 = {}
Object.assign(person2, person1)

但这个可以正常工作,并正确复制setter:

1
2
3
const person3 = {}
Object.defineProperties(person3,
Object.getOwnPropertyDescriptors(person1))

可以通过控制台测试看到:

1
2
3
4
5
6
7
person1.name = 'x'
"x"

person2.name = 'x'

person3.name = 'x'
"x"

person2不包含setter,它没有被复制过来。

对于使用Object.create()进行浅克隆的对象,也存在同样的限制。

tags: [“JavaScript”, “Object”, “getOwnPropertyDescriptors”, “property descriptors”, “Object.assign”]