- 定义属性Object.defineProperty()方法
- 定义多个属性
- 读取属性的特性
Object.defineProperty()方法直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回这个对象。
属性描述符:数据描述符和存取描述符
。
数据描述符是一个具有值的属性,该值可能是可写的,也可能是不可写的。存取描述符是由getter-setter函数描述的属性。描述符必须是两者之一,不能同时是两者。
数据描述符和存取描述符均具有以下可选键值:
configurable:是否可配置
当且仅当该属性的configurable为true时,该属性描述符才能够被改变,同时该属性也能通过delete删除该属性。如果是直接在对象上定义的属性,它们这个特性默认值为true,如果是用Object.defineProperty()这个方法定义的属性,那么这个特性默认值为false。例:
字面量定义的属性:
var person = {
name: 'nike'
}
console.log(Object.getOwnPropertyDescriptor(person, 'name'))
打印出:
configurable:true
enumerable:true
value:"biconle"
writable:true
Object.defineProperty()定义的属性:
var person = {}
Object.defineProperty(person, 'name', {
value: 'nike'
})
console.log(Object.getOwnPropertyDescriptor(person, 'name'))
打印出:
configurable:false
enumerable:false
value:"nike"
writable:false
通过以上两种定义属性的方式来看,configurable值是不同的,enumerable、writable值也是不同的。
注意:把configurable值设为false,如果对这个属性调用delete,在严格模式下会报错,而且一旦把属性定义为不可配置的,就不能再把它变回可配置的了,enumerable这个属性也就不可以更改,不然也会报错。但是writable这个属性是可以更改的,如果一开始writable为true,则value可更改,如果writable为false,则会报错,以上都是不可配置时的情况。
enumerable:是否可枚举
当且仅当该属性enumerable为true时,该属性才能够出现在对象的枚举属性中。如果直接在对象上定义的属性,它们这个特性默认值为true,如果是用Object.defineProperty()这个方法定义的属性,那么这个特性默认值为false,同上。
数据描述符同时具有以下可选键值
writable:是否可修改属性的值
当且仅当该属性writable为true时,value值才能够被修改。如果直接在对象上定义的属性,它们这个特性默认值为true,如果是用Object.defineProperty()这个方法定义的属性,那么这个特性默认值为false,同上。
value:属性值
读取属性值的时候,从这个位置读;写入属性值的时候,把新值保存在这个位置。这个特性默认值为undefined。
存取描述符同时具有以下可选键值
get
在读取属性时调用的函数。默认值为undefined。
set
在写入属性时调用的函数。默认值为undefined。
描述符可同时具有的键值
描述符 | configurable | enumerable | writable | value | get | set |
---|---|---|---|---|---|---|
数据描述符 | Yes | Yes | Yes | Yes | No | No |
存取描述符 | Yes | Yes | No | No | Yes | Yes |
下面是存取描述符的例子:
var book = {
_year = 2004,
edition: 1
}
object.defineProperty(book, 'year', {
get: function () {
return this._year
},
set: function (newVlue) {
if (newVlue > 2004) {
this._year = newVlue
this.edition += newVlue - 2004
}
}
})
book.year = 2005
console.log(book.edition) // 2
定义多个属性
如果为对象定义多个属性则用Object.defineProperties()方法,该方法接受两个对象参数:第一个是要添加或修改属性的对象,第二个是要添加的属性及描述。例:
var book = {}
object.defineProperties(book, {
_year: {
writable: true,
value: 2004
},
edition: {
writable: true,
value: 1
},
year: {
get: function () {
return this._year
},
set: function (newVlue) {
if (newVlue > 2004) {
this._year = newVlue
this.edition += newVlue - 2004
}
}
}
})
读取属性的特性
Object.getOwnPropertyDescriptor()方法可以取得给定属性的描述符。这个方法接受两个参数:属性所在的对象和要读取其描述符的属性名称。返回值是一个对象,如果是数据描述符,这个对象的属性有configurable、enumerable、writable、value,如果是存取描述符,这个对象的属性有configurable、enumerable、get、set
网友评论