数据劫持

80 阅读1分钟

数据劫持

  • 将来我们在使用框架的时(vue),框架目前都支持一个"数据驱动视图"" 完成数据驱动视图 需要帮助我们完成
  • 以原始数据为基础,对数据进行一份复刻 复刻出来的数据不允许修改的,值从原始数据里面获取

语法 Object.defineProperty('哪一个对象', '属性', '配置项')

<h1></h1>
  <h2 class="box">1</h2>
    const h1 = document.querySelector('h1')
    const box = document.querySelector('.box')
    const obj = {}
     obj.age = 18
    obj.name = '张三'
    //将obj里的属性  劫持到这个对象中
    res = {}
    Object.defineProperty(res, "age", {
      // value: 18,
      // writable: true,//能否被修改
      enumerable: true,//该属性能不能被遍历到
      get() { //叫做getter获取器,可以决定当前属性的值与value writable冲突
        // console.log("my name is gg");
        return obj.age
      },
      set(val) {
       //console.log("你现在想要修改obj的age属性,所以出发了setter函数", "你想要设置的值为" + val);
       h1.innerHTML = `res 年龄:${val}`
       obj.age = val
      }

    })
    obj.age = 99
    console.log(obj);
    h1.innerHTML = `res 年龄:${res.age}`
    box.innerHTML = `obj 年龄:${obj.age}`

封装数据劫持

html :

 <h1 class="box1">1</h1>
 <h1 class="box2">2</h1>
  //原始对象
   const obj = {}
   obj.name = '张三'
   obj.age = 18

   //如果劫持的属性多了,原本的写法不太方便,代码量比较多,所以封装数据劫持
   function observer(origin, callback) {
     const target = {}
     for (let key in origin) {
       Object.defineProperty(target, key, {
         enumerable: true,
         get() {
           return origin[key]
         },
         set(val) {
           // box1.innerHTML = `res 年龄:${val}`
           console.log(1);
           origin[key] = val
           callback(target)
         }
       })
     }
     return target
   }
   function fn(res) {
     box1.innerHTML = `年龄:${res.age};名字:${res.name}`
     console.log(111);
   }
   const newObj = observer(obj, fn)
   newObj.age = 666
   newObj.name = '阿瑟斯'