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
相關文章
相關標籤/搜索