by @zhangbao(zhangbao) #0112javascript
對象的屬性有兩種:數據屬性和訪問器屬性。咱們一般添加屬性的方式,添加的都是數據屬性。java
// 添加對象屬性的一般方式有兩種:
// 第一種:聲明時添加
let user = {
name: "John"
}
// 第二張方式:聲明後添加
user.age = 12
複製代碼
何以見得?咱們使用 Object.getOwnPropertyDescriptors(obj)
方法就能看出來。ui
Object.getOwnPropertyDescriptors
方法的對象稱爲「屬性描述符」對象。對象中的 value
就標記此屬性是數據屬性,value
的值就是此數據屬性實際存儲的值。spa
屬性描述符對象中的另外三個屬性 writable
、enumerable
、configurable
則稱爲屬性標記(flag)——記錄屬性更加細粒度的設置配置。從上圖可知,一般添加屬性的方式,默認這些標記值都是 true
,這就是爲啥咱們這樣設置屬性後,後面就能夠「隨心所欲」操做的緣由了。3d
所以可見 user.age = 12
等同於執行了下面的代碼:code
Object.defineProperty(user, 'age', {
value: 12,
writable: true,
enumerable: true,
configurable: true
})
複製代碼
咱們只有想在更加細粒度的控制某個屬性時,纔會使用 Object.defineProperty(obj, propertyName, descriptor)
方法定義屬性。cdn
在使用 Object.defineProperty
時:若是被定義的屬性已存在,則操做結果就是修改對象屬性;若是被定義的屬性不存在,操做結果就是爲對象新增了一個屬性。仍是以上面的 user
爲例。對象
修改 age
屬性的 value
值爲 123
,enumerable
標記爲 false
。blog
能夠看見,未指定的標記仍是保持跟之前同樣的值。ip
添加 desc
屬性(僅標記 writable
爲 true
)
能夠看見,其餘未指明的標記默認是 false
(即本例中的 enumerable
和 configurable
標記)。
(正文完)
廣告時間(長期有效)
我有一位好朋友開了一間貓舍,在此幫她宣傳一下。如今貓舍裏養的都是布偶貓。若是你也是個貓奴而且有須要的話,不妨掃一掃她的【閒魚】二維碼。不買也沒關係,看看也行。
(完)