title: 面向?qū)ο缶幊?1
對象:無序?qū)傩缘募希鋵傩钥梢园局等鳎瑢ο筌酱蛘吆瘮?shù)。
理解對象
創(chuàng)建自定義對象的首選方法為對象字面量形式:
var person = {
name: 'benjamin',
age: 22,
job: 'Front End Engineer',
sayName: funtion(){
alert(this.name);
}
};
屬性類型
JS中有兩種屬性:數(shù)據(jù)屬性和訪問器屬性茉继。
數(shù)據(jù)屬性
數(shù)據(jù)屬性包含一個數(shù)據(jù)值的位置咧叭。在這個位置可以讀取和寫入值。數(shù)據(jù)屬性有4個描述其行為的特質(zhì)烁竭。
如果需要修改屬性的默認(rèn)特性菲茬,必須使用Object.defineProperty()方法。此方法接受三個參數(shù):屬性所在的對象派撕,屬性名和一個描述符(descriptor)對象婉弹。描述符對象的屬性必須是:configurable、enumerable终吼、writable和value镀赌。
var person = {};
Object.defineProperty(person,'name',{
writable: false,
value: 'benjamin'
});
alert(person.name) //'benjamin'
person.name = 'llf';
alert(person.name) //'benjamin'
無法提供賦值形式修改'name'的值。該規(guī)則對于configurable同樣適用际跪。而且一旦將屬性定義為不可配置后商佛,就無法再將它變回可配置了喉钢。
訪問器屬性
訪問器屬性不包含數(shù)據(jù)值;它包含一對getter和setter函數(shù)良姆。在讀取訪問器屬性時肠虽,會調(diào)用getter函數(shù),這個函數(shù)負(fù)責(zé)返回有效的值玛追;在寫入訪問器屬性時舔痕,會調(diào)用setter函數(shù)并傳入新值,這個函數(shù)負(fù)責(zé)如何處理數(shù)據(jù)豹缀。
訪問器屬性具有以下四個特性:
由于訪問器屬性不可以直接定義伯复,必須使用Object.defineProperty()來定義。
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
訪問器屬性通常用于設(shè)置一個屬性的值會導(dǎo)致其他屬性的變化
定義多個屬性
利用Object.defineProperties()可以通過描述符一個定義多個屬性邢笙。此方法接受兩個對象參數(shù):第一個對象為要添加和修改其屬性的對象啸如,第二個對象的屬性與第一個對象中要添加或修改的屬性一一對應(yīng)。
var book = {};
Object.defineProperties(book,{
_year: {
writable: true,
value: 2004
},
edition: {
writable: true,
value: 1
},
year: {
get: function () {
return this._year;
}.
set: function (newValue) {
if (newValue > 2004) {
this._year = newValue;
this.edition += newValue - 2004;
}
}
}
})
讀取屬性特性
利用Object.getOwnPropertyDescriptor()方法可以去屬性的描述符氮惯。該方法接受兩個參數(shù):屬性所在的對象名以及要讀取其描述符的屬性的名稱叮雳。返回值是一個對象,如果是訪問器屬性妇汗。該對象的屬性就有configurable帘不、enumerable、get杨箭、set;如果是數(shù)據(jù)屬性寞焙。那就是configurable、enumerable互婿、writable捣郊、value。
var descriptor = Object.getOwnPropertyDescriptor(book,'_year');
alert(descriptor.value); //2004
alert(descriptor.configurable); //false