Object对象的JavaScript getOwnPropertyDescriptors()方法的介绍

200 阅读1分钟

了解所有关于Object对象的JavaScript getOwnPropertyDescriptors()方法的信息

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

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

例子。

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() 。比如说这个对象。

const person1 = {
  set name(newName) {
    console.log(newName)
  }
}

这种复制尝试不会工作。

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

但这将工作,并正确地复制到setter上。

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

正如你可以通过控制台测试看到的。

person1.name = 'x'
"x"

person2.name = 'x'

person3.name = 'x'
"x"

person2 错过了设置器,它没有被复制过来。

同样的限制也适用于浅层克隆对象,用 Object.create().