Object.defineProperties 新增一個/多個屬性到物件;修改已有屬性
語法:
object.defineProperties(object, descriptors)
作用:除了可以用建構函式和字面量的方式為物件設定屬性,也可以使用 object.defineProperties來新增/設定物件屬性。
引數:
object
必需。 對其新增或修改屬性的物件。 這可以是本機 JavaScript 物件或 DOM 物件。
descriptors
必需。 包含一個或多個描述符物件的 JavaScript 物件。 每個描述符物件描述一個資料屬性或訪問器屬性(意思就是物件具有資料屬性或者訪問器屬性)。 詳見:資料屬性和訪問器屬性
資料屬性
資料屬性
是可獲取和設定值的屬性。資料屬性將 value 和 writable 屬性包含在其描述符中。下表列出了資料屬性描述符的特性。
如果描述符沒有 value、writable、get 或 set 特性且指定的屬性名不存在,則會新增資料屬性。
在 configurable 特性為 false 且 writable 為 true 時,可以更改 value 和 writable 特性。
如果您在未使用 Object.defineProperty、Object.defineProperties 或 Object.create 函式的情況下新增資料屬性,則 writable、enumerable
和 configurable 特性都將設定為 true。在新增屬性後,可以使用Object.defineProperty 函式修改屬性。訪問器屬性
只要設定或檢索屬性值,訪問器屬性 就會呼叫使用者提供的函式。訪問器屬性的描述符包含 get 特性和/或 set 屬性。
下表列出了訪問器屬性描述符的特性。
在未定義 get 訪問器時,如果嘗試訪問屬性值,則將返回 undefined 值。在未定義 set 訪問器時,如果嘗試向訪問器屬性賦值,則什麼也不會發生。
以下例子給ling 這個物件設定了 資料屬性 name 和 訪問器屬性 setNameWarming
var ling={}; Object.defineProperties(ling,{ name:{ value:"zzling", //設定該屬性的初始值 writable:false, //設定可修改性 enumerable:true, //設定可列舉性 configurable:true, //設定可設定性 }, setNameWarming:{ set:function(newVal){ alert("警告:有人試圖用setNameWarming 訪問器屬性設定name 的值為"+newVal); this.name=newVal }, get:function(){ return this.name }, enumberable:true, configurable:true }} ); ling.setNameWarming="lingggggg" //呼叫setName 訪問器屬性(函式),嘗試把name 值改為"linggggg" document.write("ling.name的值:"+ling.name) //因為writable(是否可修改)特性為 false。所以name屬性值無法修改,還是返回"ling"
例子解讀:
ling.setNameWarming="lingggggg" //呼叫setName 訪問器屬性(函式),嘗試把name 值改為"linggggg" document.write("ling.name的值:"+ling.name) //因為writable(是否可修改)特性為 false。所以name屬性值無法修改,還是返回"ling"
1. 呼叫 setName 訪問器屬性(函式)設定name 的值為 "linggggg"
2. 最後返回的 ling.name 的值依舊是"ling", 沒有變為"linggggg"
因為在 name 資料屬性裡,writable (可修改行)特性為 false。