浅谈---数据劫持

本文介绍了数据劫持的概念,使用`Object.defineProperty`来创建只读属性并实现数据的获取和设置控制。通过示例展示了如何避免多余的变量名,通过备份属性并在原始数据上进行劫持。文章还对比了`defineProperty`和`defineProperties`的区别,前者一次操作一个成员,而后者可以同时处理多个成员。
摘要由CSDN通过智能技术生成

一、数据劫持


以原始数据为基础, 对数据进行一份复刻, 复刻出来数据是不允许修改的, 值从原始数据里面获取

Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。

语法:

配置项Object.defineProperties(给哪一个对象定义, 键名,{配置项})

配置项

  • value: 这个属性对应的值
  • writable: 该属性是否可以被重写, 默认是 false 不允许被修改
  • enumerable: 该属性是否可以被枚举, 默认是 false 不能被枚举到
  • get: 是一个函数, 叫做 getter 获取器, 可以决定当前属性的值, 不能与 value writable 同时出现
  • set: 是一个函数, 叫做 setter 设置器, 当你需要修改这个属性的时候, 会触发该函
  const origin = {
      name: 'zs', age: 18
    }
    const data = {}

    Object.defineProperty(data,'name',{
      get(){
        return origin.name
      },
      set(val){
        origin.name=val
      }
    })

优点:

        能捕获到修改对象属性的行为

 缺点:

         需要一个额外多余的变量名


数据劫持进阶

Object.defineProperties() 方法直接在一个对象上定义新的属性或修改现有属性,并返回该对象。

语法:Object.defineProperties(对象, { 配置项 })

为了解决多余变量名的问题, 我们在原始数据中做劫持

          把对象中的成员劫持一遍, 放在自己原始对象中

 思考:

       把自己的成员劫持到自己身上

       必然会出现覆盖行为, 所以就需要提前准备备份

 过程:

       把一个属性先做一个备份

       然后把备份劫持成原属性

  const data = { name: '张三', age: 18 }
    Object.defineProperties(data,{
      _name:{
        value:data.name,
        writable:true
      },
      name:{
        get(){
          return data._name
        },
        set(val){
          data._name=val
        }
      }
    })
    console.log(data)

二者的区别

Object.defineProperties和defineProperty的区别

defineProperty 是每次操作一个对象成员, 一次只能做一个动作就是把成员定义出来。

defineProperties 是每次操作一个对象成员, 一次可以做多个动作, 可以把当前这个成员, 先做一个备份, 在进行一次劫持。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值