Object.defineProperty()方法在一個對象上增長一個新屬性,或者修改一個對象的現有屬性的屬性描述符,並返回這個對象。數組
語法:函數
Object.defineProperty(obj,prop,descriptor)對象
參數:ip
obj:Object 必須,須要被操做的目標對象。原型鏈
prop: String 必須,目標對象須要定義或修改的屬性的名稱。文檔
descriptor :String 必須,將被定義或修改的屬性的描述符。get
描述:原型
該方法容許精確添加或修改對象的屬性的描述符,從而修改屬性是否可寫、是否可刪除、是否可枚舉的這些特性。通常狀況下,給對象添加屬性是經過賦值來建立並顯示在屬性枚舉中,這種方式添加的屬性值能夠被改變,也能夠被刪除。而使用Object.defineProperty()則容許改變這些額外細節的默認設置。默認狀況下,使用Object.definePropery()增長的屬性值是不可改變的。it
對象裏目前存在的屬性描述符有兩種主要形式:數據描述符和訪問器描述符。描述符必須是兩種形式之一;不能同時是二者。table
數據描述符有如下屬性:
默認爲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。
訪問器描述符有如下屬性:
默認爲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方法來進行處理的。