Object.defineProperty()使用方法

先说说它的语法

Object.defineProperty(obj, prop, descriptor)
obj:必需。目标对象
prop:必需。需定义或修改的属性的名字
descriptor:必需。目标属性所拥有的特性>

先看一个小例子

 // 我这样写
 let params = {
   name:'张三',
   sex:"男",
   age:20
 }
//跟这样写的区别
let params = {
   name:'张三',
   sex:"男",
 }
 Object.defineProperty(params,'age',{
   value: 12
 })

仔细看第一个params 打印跟第二个params 打印的区别在age这个颜色,而第一个params 是可以写,改,删等操作(可以在控制台试试),而第二个params 是可以被写,改,删除

writable:true,
属性的值是否可以被重写。设置为true可以被重写;设置为false,不能被重写。默认为false

enumerable:true,
此属性是否可以被枚举(使用for…in或Object.keys())。设置为true可以被枚举;设置为false,不能被枚举。默认为false

configurable:true,
是否可以删除目标属性或是否可以再次修改属性的特性(writable, configurable, enumerable)。
设置为true可以被删除或可以重新设置特性;设置为false,不能被可以被删除或不可以重新设置特性。默认为false

先不说其他的
在看看下面的代码

 let num = 10
// 第一个params
 let params = {
  name:'张三',
  sex:"男",
  age:num
 }
 //第二个params
let params = {
    name:'张三',
    sex:"男",
  }
  Object.defineProperty(params,'age',{
    value: num
  })

我提一个小小的需求,我想把这个num 的值根据我value的值变化而变化 (注意不是value的值根据num的变化而变化),对 它有两个属性函数
get(getter) :是一种获得属性值的方法
set(setter):是一种设置属性值的方法。

   let num = 10
   let params = {
     name:'张三',
     sex:"男"
   }
   Object.defineProperty(params,'age',{
     get(){ // 
     },
     set(){
      
     }
   }) 

当你加上get(),set() 这两个函数的时候 在控制台打印
在这里插入图片描述

let num = 10
let params = {
   name:'张三',
   sex:"男"
 }
 Object.defineProperty(params,'age',{
   get(){
     return num //这里将num的值设置为age:num
   },
   set(val){ // 这里会拿到修改的值
     num = val // 将最新的值赋值给num 怎么num 也会根据你设置的值自动进行修改 称为数据代理
 //何为数据代理 通过一个对象(或者)其他对另一个对象中属性的操作(读/写)
   }
 })

那么再来一个小题目(请仔细审题)

什么样的 a 可以满足 (a === 1 && a === 2 && a === 3) === true 呢?(注意
是 3 个 =,也就是严格相等)
既然是严格相等,类型转换什么的基本不考虑了。一个自然的想法就是每次访问 a 返回的值都不一样,那么肯定会想到数据劫持

let cunner = 0 
Object.defineProperty(window,'a',{
  get(){
    cunner++
    console.log('我被掉了',cunner,'次');
    return cunner
  }
})
console.log(a === 1 && a ===2 && a === 3); // true
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值