JS:平時添加的都是數據屬性

by @zhangbao(zhangbao) #0112javascript

對象的屬性有兩種:數據屬性和訪問器屬性。咱們一般添加屬性的方式,添加的都是數據屬性。java

// 添加對象屬性的一般方式有兩種:

// 第一種:聲明時添加
let user = {
  name: "John"
}
// 第二張方式:聲明後添加
user.age = 12
複製代碼

image.png

何以見得?咱們使用 Object.getOwnPropertyDescriptors(obj) 方法就能看出來。ui

image.png

Object.getOwnPropertyDescriptors 方法的對象稱爲「屬性描述符」對象。對象中的 value 就標記此屬性是數據屬性value 的值就是此數據屬性實際存儲的值。spa

默認標記值都爲 true

屬性描述符對象中的另外三個屬性 writableenumerableconfigurable 則稱爲屬性標記(flag)——記錄屬性更加細粒度的設置配置。從上圖可知,一般添加屬性的方式,默認這些標記值都是 true,這就是爲啥咱們這樣設置屬性後,後面就能夠「隨心所欲」操做的緣由了。3d

Object.defineProperty

所以可見 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 值爲 123enumerable 標記爲 falseblog

image.png

能夠看見,未指定的標記仍是保持跟之前同樣的值。ip

例二:添加屬性

添加 desc 屬性(僅標記 writabletrue

image.png

能夠看見,其餘未指明的標記默認是 false(即本例中的 enumerable 和 configurable 標記)。

(正文完)


廣告時間(長期有效)

我有一位好朋友開了一間貓舍,在此幫她宣傳一下。如今貓舍裏養的都是布偶貓。若是你也是個貓奴而且有須要的話,不妨掃一掃她的【閒魚】二維碼。不買也沒關係,看看也行。

(完)

相關文章
相關標籤/搜索