zoukankan      html  css  js  c++  java
  • 4.24observer中并不会出现类似obj.data.name读取时,obj的data与data的name都出现被读取的现象。(改正错误!)

        const obj = {
          data1: {
            data2: {
              name: "小强",
              age: 20
            },
            name: "小刚"
          },
          name: "小明",
          age: 18
        }
        //以这种obj.data1.data2.name形式访问和访问data2.name效果一样,前提是获得data2的地址然后进行访问name属性
        function observer(target) {
          //判断传入参数是否为对象
          if (typeof target !== "object" || target === null) return
          for (let key in target) {
            //属性为对象则继续observe
            let res = target[key]
            observer(res) //对属性值进行observer递归,若属性值为非对象则返回属性值,否则进行observer处理
            Object.defineProperty(target, key, {
              get() {
                console.log(key + "属性被读取了");
                return res
              },
              set(newValue) {
                observer(newValue) //如果新value是对象,则继续监听
                if (newValue !== res) {
                  console.log(key + "属性被修改了");
                  res = newValue
                }
              }
            })
          }
    
        }
    
        observer(obj)
        obj.data1.name //依次打印data1属性被读取了 name属性被读取了
        //哈默链接:https://www.bilibili.com/video/BV18p4y167We
        //结论:data中的所有初定义属性都应该被Object.defineProperty进行监听。只不过针对对象属性来说,还需要做的一步是:对对象属性进行 
        //Object.defineProperty深层次监听。另外在修改属性之的时候,对于newValue也要进行判断,若newValue为对象,则需要进行 Object.defineProperty深 
        //层次监听。
    
  • 相关阅读:
    linux PCI 接口
    Linux 内核链表头数据结构
    Linux内核链表
    spawn-fcgi原理及源代码分析
    TRIZ系列-创新原理-17-转变到新维度原理
    《转》ceilometer的数据採集机制入门
    git配置文件读取顺序
    Android Studio 使用感受 错误解决
    scikit-learn:在实际项目中用到过的知识点(总结)
    //%f表示以十进制格式化输出浮点数 %.2f
  • 原文地址:https://www.cnblogs.com/xjt31/p/14697931.html
Copyright © 2011-2022 走看看