修改屬性默認的特性:
Object.defineProperty(屬性所在的對象,屬性名字,描述符對象)
在調用Object.defineproperty()方法創建一個新的屬性時,
如果不指定,configurable、enumerable和writable特性的默認值都為false
描述符對象:
屬性對象必須為:configurable、enumerable、writable和value其中的一個或多個值
如:
var person = {}; Object.defineProperty(person,"name",{ writable:false, value:"LiAo" }) alert(person.name); // “LiAo” person.name = "MrLiao"; alert(person.name) ; //"LiAo"
屬性類型
- 數據屬性
- configurable: 能否delete、能否修改特性、能否修改為訪問器屬性,默認為true, ps: 一旦設置為false后不可逆轉
- enumerable: 能否通過for-in循環返回屬性,默認為true
- writable: 能否修改屬性值,默認為true
- value: 包含著這個屬性的值,默認為undefined
- 訪問器屬性
訪問器屬性不包含數據值,而是包含一對getter和setter函數(不是必須)
讀取訪問器屬性——>調用getter,負責返回有效的值
寫入訪問器屬性——>調用setter,負責如何處理數據
- configurable: 同上
- enumerable:同上
- Get:讀取屬性時調用的函數,默認值為undefined
- Set:寫入屬性時調用的函數,默認值為undefined
使用訪問器屬性的常見方式:設置一個屬性的值會導致其他屬性發生變化:
var book = {
_year:2004,
edition:1
};
Object.defineProperty(book,"year",{
get:function(){
return this._year;
},
set:function(newValue){
this._year = newValue;
this.edition += newValue -2004;
}
}
});
book.year = 2005;
alert(book.edition); //2
注意如果不是同時制定getter和setter的話,如只指定getter意味著屬性時不可寫的,寫入屬性會被忽略。所以要根據需求指定這兩個函數,不然會出現一些小毛病哈
定義多個屬性
使用Object.defineProperities()方法
var book = {}; Object.defineProperties(book,{ 第一個數據屬性名:{ writable等特性: 布爾值 value: 屬性值 }, 第一個數據屬性名:{ writable等特性: 布爾值 value: 屬性值 }, 第一個訪問器屬性名:{ get:function(){} set : function(){} },
讀取屬性的特征
Object.getOwnPropertyDescriptor(屬性所在的對象,屬性名稱)
若是數據屬性,返回包含configurable,enumberable,writable,value屬性的對象
若是訪問器屬性,返回包含configurable,enumberable,get,set屬性的對象