ES5中對象的屬性可以分為‘資料屬性’和‘通路器屬性’兩種。
資料屬性一般用于存儲資料數值,通路器屬性對應的是set/get操作,不能直接存儲資料值。
資料屬性特性:value、writable、enumerable、configurable。
解釋:configurable:true/false,是否可以通過delete删除屬性,能否修改屬性的特性,能否把屬性修改為通路器屬性,預設false;
enumerable:true/false,是否可以通過for in循環傳回,預設false;
writable:true/false,是否可以修改屬性的值,預設false;
value:undefined,設定屬性的值,預設undefined。
通路器屬性特性:set、get、enumerable、configurable。
解釋:configurable:true/false,是否可以通過delete删除屬性,能否修改屬性的特性,能否把屬性修改為通路器屬性,預設false;
enumerable:true/false,是否可以通過for in循環傳回,預設false;
set:function,讀取屬性值時調用的函數;
get:function,修改屬性值時調用的函數。
将屬性添加到對象或修改現有屬性的特性使用Object.defineProperty() 或 Object.defineproperties()方法;
Object.defineProperty(object, propertyname, descriptor):
參數解釋:object:需要添加或修改屬性的對象;
propertyname:屬性的名稱,字元串格式;
descriptor:屬性的描述,設定資料屬性或通路器屬性的特性。
執行個體分析:
資料屬性:
var emp = {
name:'tom'
};
Object.defineProperty(emp,'name',{
writable:false
});
emp.name = 'jery';
console.log(emp.name);//輸出tom,因為已經設定了writable為false
Object.defineProperty(emp,'age',{
configurable:false,
writable:true,
value:22
console.log(emp.age);//輸出22,因為設定了value為22
emp.age = 25;
console.log(emp.age);//輸出25,設定了writable為true
delete emp.age;
console.log(emp.age);//輸出25,設定了configurable為false,此屬性删除不了
通路器屬性:
var emp ={
_name:'tom',
_age:20
get:function(){
return this._name;
}
console.log(emp.name);//輸出tom,由get方法傳回_name的值
console.log(emp.name);//輸出tom,沒有set方法,修改不了_name的值
configurable:true,
return this._age;
}
set:function(age){
this._age = age;
emp.age = 25;
console.log(emp.age)//輸出25,emp.age=25是使用set方法将25指派給_age,emp.age是使用get方法将_age的讀取出來
console.log(emp.age);//輸出undefined,configurable為true,可以使用delete方法将emp.age屬性删除