对象有数据属性和访问器属性
1、数据属性
数据属性有四个描述它行为的特性
Configable:是否可修改? 可delete ?可改成访问器属性,用对象字面量创建的对象该属性默认是true
Enumberable:是否可通过for in 返回属性,我理解是是否可枚举,对象字面量创建的对象默认是true
Writable:是否可修改属性的值
value:对象属性的值,读取的时候从这个位置读,写入属性的时候把新的值保存在这个位置,默认是undefined
比如
var object={
a:12
}
创建了一个名为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)//小红
以为设置了不可以修改,所以无用
在调用Object.defineProperty()方法的时候,四个特性默认都是false
2、访问器属性
访问器属性不包含数据值,包含getter 和setter函数,但这两个函数是非必须的,通过getter读取值,这个函数负责返回有效的值,写入值的时候通过setter传入新的值,setter函数负责处理数据,访问器属性有四个特性:
Configable:是否可修改? 可delete ?对于直接定义在对象里的属性,这个值默认是true
Enumberable:是否可通过for in 返回属性,直接定义在对象里的属性,默认是true,所以可以便利对象的可枚举属性
getter:读取时调用,默认是undefined
setter:写入时调用,默认是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
}
}
}
})
上面同时定义了数据属性和访问器属性
4.读取属性的特性使用
let descriptor= Object.getOwnPropertyDescriptor(bo o k,'year')
console.log(descriptor.value)
js中一切皆对象,了解这些有助于阅读源码
- 参考《javascript高级程序设计》