對象有數(shù)據(jù)屬性和訪問器屬性
1、數(shù)據(jù)屬性
數(shù)據(jù)屬性有四個描述它行為的特性
Configable:是否可修改? 可delete ?可改成訪問器屬性,用對象字面量創(chuàng)建的對象該屬性默認(rèn)是true
Enumberable:是否可通過for in 返回屬性,我理解是是否可枚舉,對象字面量創(chuàng)建的對象默認(rèn)是true
Writable:是否可修改屬性的值
value:對象屬性的值,讀取的時候從這個位置讀,寫入屬性的時候把新的值保存在這個位置,默認(rèn)是undefined
比如
var object={
a:12
}
創(chuàng)建了一個名為a 的屬性,為它指定的值是12,也就是說value就是12
要修改屬性默認(rèn)的特征要用Object.defineProperty(obj, name,discriptor)
描述符對象必須是上面四種特征的其中一個或者多個
var cat={}
Object.defineProperty(cat, 'name',{
writable:false,
name:'小紅'
})
console.log(cat.name)//小紅
cat.name="小黃"
console.log(cat.name)//小紅
以為設(shè)置了不可以修改,所以無用

在調(diào)用Object.defineProperty()方法的時候,四個特性默認(rèn)都是false
2、訪問器屬性
訪問器屬性不包含數(shù)據(jù)值,包含getter 和setter函數(shù),但這兩個函數(shù)是非必須的,通過getter讀取值,這個函數(shù)負(fù)責(zé)返回有效的值,寫入值的時候通過setter傳入新的值,setter函數(shù)負(fù)責(zé)處理數(shù)據(jù),訪問器屬性有四個特性:
Configable:是否可修改? 可delete ?對于直接定義在對象里的屬性,這個值默認(rèn)是true
Enumberable:是否可通過for in 返回屬性,直接定義在對象里的屬性,默認(rèn)是true,所以可以便利對象的可枚舉屬性
getter:讀取時調(diào)用,默認(rèn)是undefined
setter:寫入時調(diào)用,默認(rèn)是undefined
訪問器屬性不能直接定義,必須使用Object.defineProperty()來定義,
let book={
_year:2004,
edition:1
}
Object.defineProperty(book,'year',{
get() {
return this._year
},
set(newYear) {
if(newYear>2004){
this._year=newYear
this.edition+=newYear-2004
}
}
})
_year 的下劃線標(biāo)記表示只能通過對象方法訪問的屬性,getter和setter不一定要同時寫,如果只寫getter表示只讀,如果寫入的話會被忽略,在嚴(yán)格模式下會拋出錯誤,沒有setter的話也不能讀,非嚴(yán)格模式會返回undefined,嚴(yán)格模式拋出異常
3、定義多個屬性
let book={
}
Object.defineProperty(book,{
_year:{
value:2004
},
edition:{
value:1
},
year:{
get() {
return this._year
},
set(newYear) {
if(newYear>2004){
this._year=newYear
this.edition+=newYear-2004
}
}
}
})
上面同時定義了數(shù)據(jù)屬性和訪問器屬性
4.讀取屬性的特性使用
let descriptor= Object.getOwnPropertyDescriptor(bo o k,'year')
console.log(descriptor.value)
js中一切皆對象,了解這些有助于閱讀源碼
- 參考《javascript高級程序設(shè)計(jì)》