JS對象的可枚舉屬性和不可枚舉屬性


昨天在寫文章(轉載)的時候發現了有些對象的方法是分可枚舉性和不可枚舉性的。
簡單的查了一下資料,今天來捋一捋啥是對象的可枚舉啥是不可枚舉。

可枚舉性:

 

對象的每一個屬性都有一個描述對象,用來描述和控制該屬性的行為,用Object.getOwnPropertyDescriptor方法來獲取該描述對象(用Object.defineProperty方法來設置)。

然后這個Object.defineProperty的方法不是vue雙向數據綁定的原理嗎!!下次再說…
描述對象的enumerable屬性,稱為”可枚舉性“,如果該屬性為false,就表示某些操作會忽略當前屬性。

 

   let obj = { start: '123' };
    console.log(Object.getOwnPropertyDescriptor(obj, 'start'))

   // 輸出內容:
     configurable: true
     enumerable: true
     value: "123"
     writable: true

下面,我們分別介紹下對象屬性的描述對象的4個屬性:
1.configurable:表示能否通過delete刪除此屬性,能否修改屬性的特性,或能否修改把屬性修改為訪問器屬性,如果直接使用字面量定義對象,默認值為true

2.enumerable: 表示該屬性是否可枚舉,即是否通過for-in循環或Object.keys()返回屬性,如果直接使用字面量定義對象,默認值為true

3.writable: 能否修改屬性的值,如果直接使用字面量定義對象,默認值為true
4.value: 該屬性對應的值,默認為undefined

經過以上的一些操作,我還是不是很真切的理解可枚舉性。那就舉一個例子

 let obj = {};
    Object.defineProperties(obj, {
        name: {
            value: '祖宗',
            enumerable: false,  //不可枚舉
        },
        age: {
            value: 88,
            enumerable: true,   //可枚舉
        }
    })
    for (let key in obj) {
        console.log("key:" + key + ',' + 'value:' + obj[key])
    }

 

 

只有可枚舉的內容被for in 循環出來了
有沒有感覺清晰了很多!!
(在這里感謝大佬提點!)

這就是個屬性,如果false遍歷就拿不到了,true遍歷就能拿到了…(研究完了發現超簡單誒。尷尬)

目前,有四個操作會忽略enumerable為false的屬性。
for…in循環:只遍歷對象自身的和繼承的可枚舉的屬性。
Object.keys():返回對象自身的所有可枚舉的屬性的鍵名。
JSON.stringify():只串行化對象自身的可枚舉的屬性。
Object.assign(): 忽略enumerable為false的屬性,只拷貝對象自身的可枚舉的屬性。

然后明兒寫原生js實現vue中的雙向數據綁定~~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM