修改屬性默認(rèn)的特性:
Object.defineProperty(屬性所在的對(duì)象,屬性名字,描述符對(duì)象)
在調(diào)用Object.defineproperty()方法創(chuàng)建一個(gè)新的屬性時(shí),
如果不指定,configurable、enumerable和writable特性的默認(rèn)值都為false
描述符對(duì)象:
屬性對(duì)象必須為:configurable、enumerable、writable和value其中的一個(gè)或多個(gè)值
如:
var person = {}; Object.defineProperty(person,"name",{ writable:false, value:"LiAo" }) alert(person.name); // “LiAo” person.name = "MrLiao"; alert(person.name) ; //"LiAo"
屬性類型
- 數(shù)據(jù)屬性
- configurable: 能否delete、能否修改特性、能否修改為訪問(wèn)器屬性,默認(rèn)為true, ps: 一旦設(shè)置為false后不可逆轉(zhuǎn)
- enumerable: 能否通過(guò)for-in循環(huán)返回屬性,默認(rèn)為true
- writable: 能否修改屬性值,默認(rèn)為true
- value: 包含著這個(gè)屬性的值,默認(rèn)為undefined
- 訪問(wèn)器屬性
訪問(wèn)器屬性不包含數(shù)據(jù)值,而是包含一對(duì)getter和setter函數(shù)(不是必須)
讀取訪問(wèn)器屬性——>調(diào)用getter,負(fù)責(zé)返回有效的值
寫(xiě)入訪問(wèn)器屬性——>調(diào)用setter,負(fù)責(zé)如何處理數(shù)據(jù)
- configurable: 同上
- enumerable:同上
- Get:讀取屬性時(shí)調(diào)用的函數(shù),默認(rèn)值為undefined
- Set:寫(xiě)入屬性時(shí)調(diào)用的函數(shù),默認(rèn)值為undefined
使用訪問(wèn)器屬性的常見(jiàn)方式:設(shè)置一個(gè)屬性的值會(huì)導(dǎo)致其他屬性發(fā)生變化:
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
注意如果不是同時(shí)制定getter和setter的話,如只指定getter意味著屬性時(shí)不可寫(xiě)的,寫(xiě)入屬性會(huì)被忽略。所以要根據(jù)需求指定這兩個(gè)函數(shù),不然會(huì)出現(xiàn)一些小毛病哈
定義多個(gè)屬性
使用Object.defineProperities()方法
var book = {}; Object.defineProperties(book,{ 第一個(gè)數(shù)據(jù)屬性名:{ writable等特性: 布爾值 value: 屬性值 }, 第一個(gè)數(shù)據(jù)屬性名:{ writable等特性: 布爾值 value: 屬性值 }, 第一個(gè)訪問(wèn)器屬性名:{ get:function(){} set : function(){} },
讀取屬性的特征
Object.getOwnPropertyDescriptor(屬性所在的對(duì)象,屬性名稱)
若是數(shù)據(jù)屬性,返回包含configurable,enumberable,writable,value屬性的對(duì)象
若是訪問(wèn)器屬性,返回包含configurable,enumberable,get,set屬性的對(duì)象