在javaScript中,對象的屬性分爲兩種類型:數據屬性和訪問器屬性。javascript
數據屬性包含的是一個數據值的位置,在這能夠對數據值進行讀寫。java
數據屬性包含四個特性,分別是:函數
訪問器屬性不包含數據值,包含的是一對get和set方法,在讀寫訪問器屬性時,就是經過這兩個方法來進行操做處理的。this
訪問器屬性包含的四個特性:code
對象的屬性經過 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