defineProperty是Object對象特有的方法,其作用是爲對象定義新的屬性和修改對象原有的屬性。
調用形式爲:Object.defineProperty(obj, prop, descriptor)
obj:屬性所在的對象
prop:屬性的名稱
descriptor:描述符對象,表示屬性的行爲對象,該對象的屬性爲爲以下的四種值,可設置其中一個或多個
1、configurable:表示能否通過delete刪除屬性,能否把屬性修改爲訪問器屬性(包含getter、setter屬函數),默認爲true。
2、enumerable:表示能否通過for-in循環返回該屬性,默認爲true。
3、writable:表示能否該修屬性的值,默認爲true.
4、value:包含屬性的值。默認爲true.
eg:修改屬性
var person={
name:'xiami'
};
person.name='xia'; //此處可以修改name的值
console.log(person.name);//xia
Object.defineProperty(person,'name',{writable:false}); //設置其屬性不可以修改
person.name='macal';
console.log(person.name) //xia
其運行結果如下:
此外該函數也可以創建屬性
eg:
var person={
name:'xiami'
};
Object.defineProperty(person,'age',
{
configurable:true, //如果不指定,默認爲false
value:22
}
);
console.log(person.age) //22
此外也可以用該方法定義訪問器屬性(用於讀取或修改對象屬性的屬性,該屬性包含getter和setter方法)
eg:
var book={
_year:2004
};
Object.defineProperty(book,'year',
{
get:function(){
console.log('調用get方法');
return this._year
},
set:function(value){
console.log('調用get方法');
this._year=value;
}
}
);
//調用修改器year屬性修改_year
book.year=2017;
//調用訪問器屬性year訪問_year
console.log(book.year);
其運行結果如下:
可見,修改器屬性相當於一個用於修改對象屬性的屬性
不過在實際運用中一般比較少用該方法。