在javaScript中,对象的属性分为两种类型:数据属性和访问器属性。
数据属性
数据属性包含的是一个数据值的位置,在这可以对数据值进行读写。
数据属性包含四个特性,分别是:
- configurable:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或能否把属性修改为访问器属性,默认为true
- enumerable:表示能否通过for-in循环返回属性
- writable:表示能否修改属性的值
- value:包含该属性的数据值。默认为undefined
访问器属性
访问器属性不包含数据值,包含的是一对get和set方法,在读写访问器属性时,就是通过这两个方法来进行操作处理的。
访问器属性包含的四个特性:
- configurable:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或能否把属性修改为访问器属性,默认为false
- enumerable:表示能否通过for-in循环返回属性,默认为false
- Get:在读取属性时调用的函数,默认值为undefined
- Set:在写入属性时调用的函数,默认值为undefined
属性的读取与修改
对象的属性通过 Object.getOwnPropertyDescriptor() 获取对象的属性通过 Object.defineProperty() 修改
数据属性和访问器属性是同级别的关系,只是由于功能不同把它们分成两派,按照它们所谓的 “特征值” 定义这个属性的性质。访问器属性只是因为它带有可以访问对象内其它属性的功能(通过 getter、setter 函数),并经过一些处理从而实现 “设置一个属性的值会导致其他属性发生变化”的效果。
如果一个对象属性同时有(value或writable)和(get或set)关键字,将会产生一个异常如果只指定get方法,不指定set方法,那么这个属性是只读的,反之则是只写的
let obj = {a:1,_b:2}
Object.getOwnPropertyDescriptor(obj,'a')
/*
{
value: 1,
writable: true,
enumerable: true,
configurable: true
}
*/
//修改数据属性
Object.defineProperty(obj,'a',{
value: 100,
writable: false,
enumerable: false,
configurable: true
})
Object.getOwnPropertyDescriptor(obj,'a')
/*
{
value: 100,
writable: false,
enumerable: false,
configurable: true
}
*/
// 修改访问器属性
Object.defineProperty(obj,'b',{
get(){
return this._b
},
set(newVal){
this._b = this._b + newVal
},
})
obj.b = 5
console.log(obj.b) // 7
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。