對象有數(shù)據(jù)屬性和訪問器屬性
1蛀蜜、數(shù)據(jù)屬性
數(shù)據(jù)屬性有四個描述它行為的特性
Configable:是否可修改闰围? 可delete ?可改成訪問器屬性译红,用對象字面量創(chuàng)建的對象該屬性默認是true
Enumberable:是否可通過for in 返回屬性技掏,我理解是是否可枚舉贺待,對象字面量創(chuàng)建的對象默認是true
Writable:是否可修改屬性的值
value:對象屬性的值,讀取的時候從這個位置讀零截,寫入屬性的時候把新的值保存在這個位置,默認是undefined
比如
var object={
a:12
}
創(chuàng)建了一個名為a 的屬性秃臣,為它指定的值是12涧衙,也就是說value就是12
要修改屬性默認的特征要用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()方法的時候奥此,四個特性默認都是false
2弧哎、訪問器屬性
訪問器屬性不包含數(shù)據(jù)值,包含getter 和setter函數(shù)稚虎,但這兩個函數(shù)是非必須的撤嫩,通過getter讀取值,這個函數(shù)負責返回有效的值蠢终,寫入值的時候通過setter傳入新的值序攘,setter函數(shù)負責處理數(shù)據(jù),訪問器屬性有四個特性:
Configable:是否可修改寻拂? 可delete 程奠?對于直接定義在對象里的屬性,這個值默認是true
Enumberable:是否可通過for in 返回屬性祭钉,直接定義在對象里的屬性瞄沙,默認是true,所以可以便利對象的可枚舉屬性
getter:讀取時調(diào)用慌核,默認是undefined
setter:寫入時調(diào)用距境,默認是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 的下劃線標記表示只能通過對象方法訪問的屬性垫桂,getter和setter不一定要同時寫,如果只寫getter表示只讀扒接,如果寫入的話會被忽略伪货,在嚴格模式下會拋出錯誤们衙,沒有setter的話也不能讀,非嚴格模式會返回undefined碱呼,嚴格模式拋出異常
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è)計》