JavaScript對象內部屬性及其特性總結

數據屬性和訪問器屬性

數據屬性 訪問器屬性
共同特性 [[enumerable]]
[[configurable]]
特有特性 [[writable]] [[get]]
[[value]] [[set]]
設置單個屬性方法 Object.defineProperty(obj, prop, descriptor)
設置多個屬性方法 Object.defineProperties(obj, props)
讀取單個屬性描述符 Object.getOwnPropertyDescriptor(obj, prop)
讀取對象全部屬性描述符 Object.getOwnPropertyDescriptors(obj)
備註 obj: 須要被操做的目標對象;
prop: 目標對象須要定義(讀取)或修改的屬性的名稱;
descriptor: 將被定義或修改的屬性的描述符;
props: 該對象的一個或多個鍵值對定義了將要爲對象添加或修改的屬性的具體配置;

特性詳情

  • [[Configurable]]:函數

    • 表示可否經過delete刪除屬性從而從新定義屬性,(設置爲false,表示不能從對象中刪除屬性(在嚴格模式下調用delete會報錯)),
    • 可否修改屬性的特性,
    • 可否把數據屬性修改成訪問器屬性(或相反),
    • true修改成false是單向的,即一旦把把屬性定義爲不可配置的,就不能再把它變回可配置了(此時只能單向修改writabletruefalse)。
  • [[Enumerable]]: 表示可否經過for-in循環返回屬性
  • [[Writable]]: 表示可否修改屬性的值
  • [[Value]] : 包含這個屬性的數據值
  • [[Get]]: 讀取屬性時調用的函數,默認值爲undefined
  • [[Set]]: 寫入屬性時調用的函數,默認值爲undefined

其中直接在對象上定義的屬性, [[Configurable]], [[Enumerable]], [[Writable]]默認值均爲true;
經過 Object.defineProperty()方法或 Object.defineProperties()方法,若是不指定 writale, enumerable, configurable 的值,則所有默認爲 false。

定義屬性

定義單個屬性

Object.defineProperty(book, 'actor', {
    value: 'Nicholas'
})

定義多個屬性

var book = {}
Object.defineProperties(book,{
    _year:{
        writable: true,
        value: 2004
    },
    edition:{
        writable: true,
        value: 1
    },
    // year爲訪問器屬性
    year:{
        get: function(){
            return this._year;
        },
        set: function(newValue){
            if(newValue > 2004){
                this._year = newValue;
                this.edition += newValue - 2004;
            }
        }
    }
});
// {_year: 2004, edition: 1}

讀取屬性的描述符

讀取單個屬性的描述符

Object.getOwnPropertyDescriptor(book, '_year'); 
// {value: 2006, writable: true, enumerable: false, configurable: false}
Object.getOwnPropertyDescriptor(book, 'edition'); 
// {value: 3, writable: true, enumerable: false, configurable: false}
Object.getOwnPropertyDescriptor(book, 'year'); 
// {get: ƒ, set: ƒ, enumerable: false, configurable: false}

Object.getOwnPropertyDescriptor(book, 'actor'); 
// {value: "Nicholas", writable: false, enumerable: false, configurable: false}

讀取全部屬性的描述符

Object.getOwnPropertyDescriptors(book)

圖片描述

注意

從上面代碼 Object.getOwnPropertyDescriptor()執行結果中能夠看出來, 經過Object.defineProperty()方法或Object.defineProperties()方法,若是不指定數據屬性或訪問器屬性的writale, enumerable, configurable 的值,則所有默認爲 false
相關文章
相關標籤/搜索