JavaScript之数据属性和访问器属性

在javaScript中,对象的属性分为两种类型:数据属性和访问器属性。javascript

数据属性

数据属性包含的是一个数据值的位置,在这能够对数据值进行读写。java

数据属性包含四个特性,分别是:函数

  • configurable:表示可否经过delete删除属性从而从新定义属性,可否修改属性的特性,或可否把属性修改成访问器属性,默认为true
  • enumerable:表示可否经过for-in循环返回属性
  • writable:表示可否修改属性的值
  • value:包含该属性的数据值。默认为undefined

访问器属性

访问器属性不包含数据值,包含的是一对get和set方法,在读写访问器属性时,就是经过这两个方法来进行操做处理的。this

访问器属性包含的四个特性:code

  • configurable:表示可否经过delete删除属性从而从新定义属性,可否修改属性的特性,或可否把属性修改成访问器属性,默认为false
  • enumerable:表示可否经过for-in循环返回属性,默认为false
  • Get:在读取属性时调用的函数,默认值为undefined
  • Set:在写入属性时调用的函数,默认值为undefined

属性的读取与修改

对象的属性经过 Object.getOwnPropertyDescriptor() 获取

对象的属性经过 Object.defineProperty() 修改对象

数据属性和访问器属性是同级别的关系,只是因为功能不一样把它们分红两派,按照它们所谓的 “特征值” 定义这个属性的性质。访问器属性只是由于它带有能够访问对象内其它属性的功能(经过 getter、setter 函数),并通过一些处理从而实现 “设置一个属性的值会致使其余属性发生变化”的效果。ip

若是一个对象属性同时有(value或writable)和(get或set)关键字,将会产生一个异常

若是只指定get方法,不指定set方法,那么这个属性是只读的,反之则是只写的get

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
相关文章
相关标签/搜索