目录
ES8如何获取Object的描述符
- 设置描述符应用defineProperty()
- 获取单个属性的描述符 —— Object.getOwnPropertyDescriptor()
- 获取所有属性外面的数据描述符 —— Object.getOwnPropertyDescriptors()
描述符
- 描述符参考
- 能够拷贝getter和setter属性
- ES6-ES10学习幅员
ES8如何获取Object的描述符
Object.getOwnPropertyDescriptor()
只能获取对象属性的描述符然而不能对其进行批改
设置描述符应用defineProperty()
- 第一个参数指标对象
- 第二个参数指标属性(能够是
Symbol
) - 第三个参数是对描述符进行配置,
true
是开启,false
是敞开 - 返回传递的指标对象
const data = { Portland: '78/50', Dublin: '88/52', Lima: '58/40'}Object.defineProperty(data, 'Lima', { enumerable: false, // 不可枚举 writable: false // 不可改写})// 不可枚举的对象不会在外面console.log(Object.keys(data))// ["Portland", "Dublin"]
获取单个属性的描述符 —— Object.getOwnPropertyDescriptor()
获取对象属性的描述符
- 第一个参数指标对象
- 第二个参数指标属性
- 返回值是对象及其所有描述符,找不到属性返回
undefined
//能够看到单个属性的描述符console.log(Object.getOwnPropertyDescriptor(data, 'Lima'))// {value: "58/40", writable: false, enumerable: false, configurable: true}
获取所有属性外面的数据描述符 —— Object.getOwnPropertyDescriptors()
只承受一个参数,指标对象。
// 能够看到所有属性外面的数据描述符console.log(Object.getOwnPropertyDescriptors(data))// Portland: {value: "78/50", writable: true, enumerable: true, configurable: true}// Dublin: {value: "88/52", writable: true, enumerable: true, configurable: true}// Lima: {value: "58/40", writable: false, enumerable: false, configurable: true}
描述符
对于数据描述符汇合与其含意。
描述符 | 备注 |
---|---|
value | [属性的值] |
writable | [属性的值是否可被扭转] |
enumerable | [属性的值是否可被枚举] |
configurable | [描述符自身是否可被批改,属性是否可被删除] |
get | [获取该属性的拜访器函数(getter)。如果没有拜访器, 该值为undefined。] |
set | [获取该属性的设置器函数(setter)。 如果没有设置器, 该值为undefined] |
描述符参考
- Object.defineProperty MDN
- Object.getOwnPropertyDescriptor MDN
能够拷贝getter和setter属性
应用Object.assign无奈对getter和setter的内容进行拷贝
const p1 = { firstName: 'Lei', lastName: 'Wang', get fullName () { return this.firstName + ' ' + this.lastName }}const p2 = Object.assign({}, p1)p2.firstName = 'Xiao'console.log(p2)// { firstName: 'Xiao', lastName: 'Wang', fullName: 'Lei Wang' }// 这外面get的货色没有进行扭转,因为Object.assign只是把fullName当成一般变量获取了
如果要获取全副的,那么须要这样做
const descriptors = Object.getOwnPropertyDescriptors(p1)console.log(descriptors)/** 获取了全副的形容信息,而后再一个新对象上定义过来,这样能力全副拷贝过来{ firstName: { value: 'Lei', writable: true, enumerable: true, configurable: true }, lastName: { value: 'Wang', writable: true, enumerable: true, configurable: true }, fullName: { get: [Function: get fullName], set: undefined, enumerable: true, configurable: true }}*/const p3 = Object.defineProperties({}, descriptors)p3.firstName = 'Hu'console.log(p3.fullName) // Hu Wang