一、属性类型
1、数据属性
1)数据属性包括4个描述其行为的特性:
- configurable:可配置的,直接在对象上定义的属性,它的可配置特性默认为true
- enumerable:可枚举的,直接在对象上定义的属性,它的可配置特性默认为true
- writable:可写的,直接在对象上定义的属性,它的可配置特性默认为true
- value:数据值,默认值为undefined
2)可使用Object.defineProperty()方法定义或修改属性特性
接收3个参数:属性所在对象、属性名、一个描述符对象(只能设置上述4个特性)
const person = {}
Object.defineProperty (person, 'name', {
writable: false,//设置该属性为只读
configurable: false,//设置属性不可配置
value: 'diana'
})
console.log(person.name)//diana:value值
person.name = 'js'
console.log(person.name)//diana:不可写
delete person.name
console.log(person.name)//diana:不可配置
一旦把属性定义为不可配置的,就无法再变回可配置的了:
Object.defineProperty (person, 'name', {
configurable: true
})//报错:Cannot redefine property: name
注意:当使用Object.defineProperty()方法创建一个属性,该属性的数据属性默认都是false
2、访问器属性
- configurable:可配置的,,直接在对象上定义的属性,它的可配置特性默认为true
- enumerable:可枚举的,直接在对象上定义的属性,它的可配置特性默认为true
- get:读取属性时调用的get()函数,默认值为undefined
- set:读取属性时调用的set()函数,默认值为undefined
访问器属性不能直接定义,必须使用Object.defineProperty()方法定义:
const book = {
_year: 2004,
edition: 1
}
Object.defineProperty(book, 'year', {
get: function() {
return this._year
},
set: function(newVal) {
if (newVal > 2004) {
this._year = newVal
this.edition += (newVal - 2004)
}
}
})
console.log(book.year)//2004:调用访问器属性year的get函数
book.year = 2008//调用访问器属性year的set函数并传入参数2008
console.log(book.edition)//5
二、定义多个属性
使用Object.defineProperties()方法,接收2个参数:要修改/添加的对象、与被修改/添加对象的属性一一对应的第二个对象
const book = {}
Object.defineProperties(book, {
_year: {//数据属性
writable: true,
value: 2004
},
edition: {//数据属性
writable: true,
value: 1
},
year: {//访问器属性
get: function () {//getter函数
return this._year
},
set: function (newVal) {//setter函数
if (newVal > 2004) {
this._year = newVal
this.edition += newVal - 2004
}
}
}
})
console.log(book.year)//2004
book.year=2006
console.log(book.edition)//3
三、读取属性的特性
使用Object.getOwnPropertyDescriptor()方法,接收2个参数:属性所在对象、属性名
const book = {}
Object.defineProperties(book, {
_year: {//数据属性
writable: true,
value: 2004
},
edition: {//数据属性
writable: true,
value: 1
},
year: {//访问器属性
get: function () {//getter函数
return this._year
},
set: function (newVal) {//setter函数
if (newVal > 2004) {
this._year = newVal
this.edition += newVal - 2004
}
}
}
})
// 读取数据属性的特性
var descriptor = Object.getOwnPropertyDescriptor(book, '_year')
console.log(descriptor.value)//2004
console.log(descriptor.writable)//true
console.log(descriptor.enumerable)//false
console.log(descriptor.configurable)//false
console.log(typeof descriptor.get)//undefined
// 读取访问器属性的特性
var descriptor = Object.getOwnPropertyDescriptor(book, 'year')
console.log(descriptor.value)//undefined
console.log(typeof descriptor.get)//function
console.log(typeof descriptor.set)//function
console.log(descriptor.configurable)//false
console.log(descriptor.enumerable)//false