1、对象的定义与赋值
一般使用obj.prop = value
或者obj['prop'] = value
let person = {}
person.name = 'jack'
person[age] = 18
2、Object.defineProperty()语法
Object.defineProperty()
是直接在一个对象上定义一个新属性,或者修改一个已经存在的属性
Object.defineProperty(obj,prop,desc)
- obj 需要定义属性的当前对象
- prop 当前需要定义的属性名
- desc 属性描述
3、属性描述
3.1 value
定义属性值
let person = {}
Object.defineProperty(person,'name',{
value:'jack'
})
console.log(person.name);//jack
3.2 writable
属性值是否能够修改
let person = {}
Object.defineProperty(person,'name',{
value:'jack'
})
person.name = 'rose'//writable默认为false,所有修改失败
console.log(person.name)//jack
let person = {}
Object.defineProperty(person,'name',{
value:'jack',
writable:true
})
person.name = 'rose'
console.log(person.name)//rose
3.3 getter和setter
get
:在属性被访问的时候调用
set
:在属性被赋值的时候调用
let person = {}
let temp = null
Object.defineProperty(person,'name',{
get() {
return temp
},
set(value) {
temp = value
}
})
3.4 configurable
当且仅当该属性的 configurable 为 true 时,该属性描述符才能够被改变,同时该属性也能从对应的对象上被删除。默认为 false。
删除属性
let person = {}
Object.defineProperty(person,'name',{
value:'jack'
})
let person = {}
Object.defineProperty(person,'name',{
value:'jack',
configurable:true
})
修改描述符
let person = {}
Object.defineProperty(person,'name',{
value:'jack',
configurable:true
})
person.name = 'rose'
console.log('修改属性之前 '+person.name);//jack
Object.defineProperty(person,'name',{
value:'jack',
writable:true
})
person.name = 'rose'
console.log('修改属性之后 '+person.name);//rose
-
configurable: false 时,不能删除当前属性,且不能重新配置当前属性的描述符(有一个小小的意外:可以把writable的状态由true改为false,但是无法由false改为true),但是在writable: true的情况下,可以改变value的值
-
configurable: true时,可以删除当前属性,可以配置当前属性所有描述符。
3.5 enumerable
enumerable设置为false后,不可被枚举
let person = {}
Object.defineProperty(person,'name',{
value:'jack',
enumerable:false
})
Object.defineProperty(person,'age',{
value:18,
enumerable:true
})
console.log(Object.keys(person));//['age']