ES5中對(duì)象的屬性可以分為‘?dāng)?shù)據(jù)屬性’和‘訪問器屬性’兩種。
數(shù)據(jù)屬性一般用于存儲(chǔ)數(shù)據(jù)數(shù)值,訪問器屬性對(duì)應(yīng)的是set/get操作,不能直接存儲(chǔ)數(shù)據(jù)值。
1.數(shù)據(jù)屬性特性:value、writable、enumerable、configurable。
解釋:configurable:true/false,是否可以通過delete刪除屬性默認(rèn)false;
enumerable:true/false,是否可以通過for in循環(huán)返回,默認(rèn)false;
writable:true/false,是否可以修改屬性的值,默認(rèn)false;
value:undefined,設(shè)置屬性的值,默認(rèn)undefined。
var person = {};
Object.defineproperty(person,"name",{
writable : false, //修改屬性的值為只讀(不可修改)
configurable : false; // 設(shè)置為不可刪除屬性
value : "Mr.Chen"
});
alert(person.name); //"Mr.Chen"
person.name = "chen";
alert(person.name);//"Mr.Chen"
2.訪問器屬性特性:set、get、enumerable、configurable。
解釋:configurable:true/false,是否可以通過delete刪除屬性,默認(rèn)false;
enumerable:true/false,是否可以通過for in循環(huán)返回,默認(rèn)false;
set:function,讀取屬性值時(shí)調(diào)用的函數(shù);
get:function,修改屬性值時(shí)調(diào)用的函數(shù)。
var book = {
_year: 2004,
edition: 1
};
Object.defineProperty(book, "year", {
get: function(){
return this._year;
},
set: function(newValue){
if (newValue > 2004) {
this._year = newValue;
this.edition += newValue - 2004;
}
}
});
book.year = 2005;
alert(book.edition); //2
將屬性添加到對(duì)象或修改現(xiàn)有屬性的特性使用Object.defineProperty() 或 Object.defineproperties()方法;
Object.defineProperty(object, propertyname, descriptor):
參數(shù)解釋:object:需要添加或修改屬性的對(duì)象;
propertyname:屬性的名稱,字符串格式;
descriptor:屬性的描述,設(shè)置數(shù)據(jù)屬性或訪問器屬性的特性。