Object.defineProperty詳解

Object.defineProperty()方法在一個對象上增長一個新屬性,或者修改一個對象的現有屬性的屬性描述符,並返回這個對象。數組

語法:函數

Object.defineProperty(obj,prop,descriptor)對象

參數:ip

obj:Object   必須,須要被操做的目標對象。原型鏈

prop: String  必須,目標對象須要定義或修改的屬性的名稱。文檔

descriptor :String  必須,將被定義或修改的屬性的描述符。get

描述:原型

該方法容許精確添加或修改對象的屬性的描述符,從而修改屬性是否可寫、是否可刪除、是否可枚舉的這些特性。通常狀況下,給對象添加屬性是經過賦值來建立並顯示在屬性枚舉中,這種方式添加的屬性值能夠被改變,也能夠被刪除。而使用Object.defineProperty()則容許改變這些額外細節的默認設置。默認狀況下,使用Object.definePropery()增長的屬性值是不可改變的。it

對象裏目前存在的屬性描述符有兩種主要形式:數據描述符和訪問器描述符。描述符必須是兩種形式之一;不能同時是二者。table

數據描述符有如下屬性:

  1. configurable(可配置性)

默認爲false。當configurable爲false時,enumerable不能夠修改,若是修改enumerable則會報錯,value和writable能夠修改(MDN文檔上說configurable特性爲false,則其writable特性只能修改成false,親測,這句是錯的),該屬性不能被delete從目標對象上刪除。當configurable爲true時,其餘描述符均可以修改,且該屬性能夠被delete從目標對象上刪除。還發現當configurable首先設爲true再修改成false,enumerable也是能夠修改的

       2.enumerable(可枚舉性)

默認爲false。當writable設置爲false時,屬性值不能被修改,修改無效,不會報異常。

      3.writable(可寫性)

默認爲false。屬性特性 enumerable 定義了對象的屬性是否能夠在 for...in 循環和 Object.keys() 中被枚舉。

     4.value(屬性值)

默認爲false。

訪問器描述符有如下屬性:

  1. configurable(可配置性)

默認爲false。當configurable爲false時,enumerable,set和get都不能夠修改,該屬性不能被delete從目標對象上刪除。當configurable爲true時,其餘描述符均可以修改,且該屬性能夠被delete從目標對象上刪除。還發現當configurable首先設爲true再修改成false,enumerable,set和get也都是能夠修改的。

   2.enumerable(可枚舉性)

默認爲false。當writable設置爲false時,屬性值不能被修改,修改無效,不會報異常。

   3.set

在寫入屬性時調用的函數。默認值爲undefined

   4.get

在讀取屬性時調用的函數。默認值爲undefined

注意:MDN上說數據描述符和訪問器描述符不能相互切換,其實是configurable爲false的狀況下才不能相互切換,爲true是能夠相互切換的。

強調一點,VUE的雙向數據綁定就是利用Object.defineProperty()的get和set方法來進行處理的。

相關文章
相關標籤/搜索