代码在最后
定义:Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象
Object.defineProperty(obj, prop, descriptor)
obj:要定义属性的对象
prop:要定义或修改的属性的名称或 Symbol
descriptor:要定义或修改的属性描述符
通常情况下,我们为对象的属性赋值,对象的属性可以进行修改或删除,通过描述符的设置可以进行更精准的控制对象属性。
Object.defineProperty(person,'age',{
value:18, // 属性值
enumerable:true, //控制属性是否可以枚举,默认值是false
writable:true, //控制属性是否可以被修改,默认值是false
configurable:true //控制属性是否可以被删除,默认值是false
})
- enumerable:开启后可以在for…in中遍历
- writable:开启后可以进行赋值修改
- configurable:开启后可以使用delete删除此属性
除了这些属性,还有两个特殊的属性get和set
get 是获取值的时候的方法,类型为 function ,获取值的时候会被调用,不设置时为 undefined
(注意:get方法不能和value同时设置,只选其一)
set 是设置值的时候的方法,类型为 function ,设置值的时候会被调用,undefined
(注意:set方法不能和writable同时设置,只选其一)
get或set不是必须成对出现,任写其一就可以
let people = {
name: '张三',
sex: '男',
}
let Str = '徒手捏爆小行星'
Object.defineProperty(people, 'merit', {
// value: '法外狂徒',
enumerable: true,
// writable: true,
configurable: true,
get() {
console.log('调用get');
return Str
},
set(value) {
console.log('调用set');
Str = value
}
})
console.log(people.merit, 'merit修改前');
people.merit = '打工是不可能的!'
console.log(people.merit, 'merit修改后');
console.log('遍历key,验证enumerable属性是否开启');
for (const i in people) {
console.log(people[i]);
}
console.log('删除merit');
delete people.merit
console.log(people.merit);