Object.defineProperty()方法的原理及使用

Object.defineproperty(obj, prop, descriptor)
- obj:目标对象**
- prop:需定义或修改的目标对象的属性*
- descriptor:目标属性所拥有的特性*

以下是descriptor内常用的一些特性

  1. value 被定义的属性的值,默认为undefined

let obj1 = { name: 1 }
    Object.defineProperty(obj1, 'age', {
       value: 18  //age的值
    })
console.log(obj1.age);  // 18
  1. 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
  1. 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没有被遍历
}
  1. 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}  未删除成功
  1. 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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值