Object.defineproperty(obj, prop, descriptor)
- obj:目标对象**
- prop:需定义或修改的目标对象的属性*
- descriptor:目标属性所拥有的特性*
以下是descriptor内常用的一些特性
value 被定义的属性的值,默认为undefined
let obj1 = { name: 1 }
Object.defineProperty(obj1, 'age', {
value: 18 //age的值
})
console.log(obj1.age); // 18
writable 是否可以被重写,true可以重写,false不能重写,默认为false。
let obj1 = { name: 1 }
Object.defineProperty(obj1, 'age', {
value: 18, //age的值
writable: false, //false 不能重写
})
console.log(obj1.age); // 18
obj1.age = 22 //修改age的值
console.log(obj1.age); //还是 18
enumerable:是否可以被枚举(使用for...in或object.keys())。设置为true可以被枚举;设置 为false,不能被枚举。默认为false。
let obj1 = { name: '小明' }
Object.defineProperty(obj1, 'age', {
value:18
enumerable:false,
})
for(const keys in obj1){
console.log(obj1[keys]); //只输出了 小明,说明age没有被遍历
}
configurable:是否可以删除目标属性或是否可以再次修改属性的特(writable,configurable,)默认值为false
let obj1 = { name: '小明' }
Object.defineProperty(obj1, 'age', {
value: 18, //age的值
writable: false, //false 不能重写
configurable:false, //是否可以被删除
})
delete obj1.age //删除对象的age属性
console.log(obj1); //{name: '小明', age: 18} 未删除成功
getter和setter 注意:当使用了getter或setter方法,不允许使用writable和value这两个属性,会造成冲突
getter:当访问该属性时,该方法会被执行。函数的返回值会作为该属性的值返回。
setter:当属性值修改时,该方法会被执行。该方法将接受唯一参数,即该属性新的参数值。
let obj1 = { name: '小明' }
let initValue = 18
Object.defineProperty(obj1,'age',{
get:function(){
console.log('有人访问了age属性');
return initValue //注意这里不能直接写 return age ,那么会再去执行get函数,会造成无限循环导致栈溢出
},
set:function(value){ //value为修改后的值
console.log('有人修改了age属性');
initValue = value // 注意这里也不能这样写 obj1.age = value ,同样会导致无限循环set函数,栈溢出
}
})
obj1.age = 22 //触发 set
console.log(obj1.age); //触发 get