前言
在JavaScript中对象是我们经常用到的,它包括各种属性和方法,而对象的属性有两种类型:数据属性和访问器属性
对象属性
对象的一个属性要么是数据属性,要么是访问器属性,不能两者都存在,否则被抛出错误
let obj = {}
Object.defineProperty(obj, 'name', {
value: 'hello world',
get() {
return 'hi world'
}
})
console.log(obj.name)
数据属性和访问器属性的特性是为了实现JavaScript引擎用的,因此不能直接在JavaScript中进行访问
数据属性
let obj = {
name: 'hello world' // name就是数据属性
}
let obj = new Object()
obj.name = 'hello world' // name就是数据属性
Obj.defineProperty(obj, 'name', {
value: 'hello world' // name就是数据属性
})
对于数据属性有四个描述其行为的特性:
- value:表示这个属性的值,读取属性值的时候,从这个位置读取,写入属性值的时候,把新值保存在这个位置,默认值为undefined
- configurable:表示能否通过delete删除这个属性
- enumerable:表示能否通过for...in属性返回属性
- writable:表示能否修改属性的值
通过new Object()或对象字面量方式创建对象后添加的属性,configurable,enumerable,writable特性值都为true,通过Object.defineProperty()定义的属性,默认值都为false
访问器属性
访问器属性不能直接定义,必须通过Object.defineProperty()来进行定义
let obj = {}
Object.defineProperty(obj, 'name', {
configurable: true,
enumerable: true,
get() {
return 'hello world'
},
set(val) {
console.log('设置了值')
}
})
访问器属性有四个描述其行为的特性:
- configurable:表示能否通过delete进行删除
- enumerable:表示能否通过for...in进行循环属性
- get:在读取属性时调用的函数
- set:在写入属性时调用的函数