对象属性的特性描述符,可以理解为对象属性的属性。
一个对象属性有上面这些属性,其中value,和get,set是用来定义属性值的,这两种定义方式只能采取一种,不能同时出现。
剩下的configurable,enumerable,writable用来描述一个对象属性的读写特性。这三个都是boolean值。
configurable表示可配置性,enumerable表示可枚举性,writable表示可修改性。
configurable表示属性定义后,是否还可以通过Object.defineProperty来修改属性的特性,为false时,再次调用Object.defineProperty方法修改属性特性会报错。并且为false时,是不能通过delete操作符删除此属性的。只有为true时才可以修改或者删除。
enumerable表示的是此属性是否可以进行枚举,为false时,在for...in循环,Object.keys()中都不会出现此属性。为true时,才可以通过遍历获得此属性。
writable表示此属性是否可以被修改赋值,为false时,修改属性值无效,严格模式下会报错的。
这三个读写配置属性的默认值都为false。
Object.defineProperty
Object.defineProperty方法用来在对象上定义添加一个属性,或者修改一个属性。
通过Object.defineProperty()方法给对象添加属性,可以设置属性的读写特征描述符。然后我们之后想要将name属性的writable改为true,可以像下面这样写:
对于对象已有属性使用Object.defineProperty方法,会修改这个属性的值或者相应的特征描述符。二次使用Object.defineProperty方法有点像$.extend对象赋值方式。
Object.defineProperty方法就是用来添加或者修改对象属性的,并且可以通过属性特征描述符来控制属性的可配置性,可枚举性,可修改性。
Object.defineProperties
Object.defineProperties和Object.defineProperty的关系就如同他们的名字一样,是单数和复数的关系。Object.defineProperty一次只能定义一个属性,而Object.defineProperties一次可以定义多个属性:
Object.defineProperties(obj, props)
语法上,Object.defineProperties只有两个参数,比Object.defineProperty少了一个参数。
Object.defineProperties的第二个参数是一个属性集合对象。
通过以上的代码形式,使用Object.defineProperties可以一次定义或修改对象上N多个属性,是为了给Object.defineProperty提供方便而生的。
Object.defineProperty和Object.defineProperties这两个属性在IE9+浏览器中都支持。