1. 程式人生 > >Object.defineProperties 新增一個/多個屬性到物件;修改已有屬性

Object.defineProperties 新增一個/多個屬性到物件;修改已有屬性

語法:

object.defineProperties(object, descriptors)

作用:除了可以用建構函式和字面量的方式為物件設定屬性,也可以使用 object.defineProperties來新增/設定物件屬性。

引數:

object

必需。 對其新增或修改屬性的物件。  這可以是本機 JavaScript 物件或 DOM 物件。  

descriptors

必需。 包含一個或多個描述符物件的 JavaScript 物件。  每個描述符物件描述一個資料屬性訪問器屬性(意思就是物件具有資料屬性或者訪問器屬性)。 詳見:資料屬性和訪問器屬性

資料屬性

資料屬性

 是可獲取和設定值的屬性。資料屬性將 value 和 writable 屬性包含在其描述符中。

下表列出了資料屬性描述符的特性。

如果描述符沒有 valuewritableget 或 set 特性且指定的屬性名不存在,則會新增資料屬性。

在 configurable 特性為 false 且 writable 為 true 時,可以更改 value 和 writable 特性。

如果您在未使用 Object.definePropertyObject.defineProperties 或 Object.create 函式的情況下新增資料屬性,則 writableenumerable

 和 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。