对象

对象有数据属性和访问器属性

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)//小红

以为设置了不可以修改,所以无用


image.png

在调用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高级程序设计》

你可能感兴趣的:(对象)