• 检测js对象发生变化


    <!DOCTYPE html>
    <html lang="en">
    <head>
        <title></title>
    </head>
    <body>
    
        <div>
            <p class="box"></p>
            <ul class="hobby"></ul>
        </div>
    
        <script>
    
            var box = document.querySelector('.box');
            var hobby = document.querySelector('.hobby')
            class Observer{
                constructor(data){
                    this.data = data
                    this.filterObj(data)
                }
    
                // 判断传入的参数的数据类型是不是一个对象
                static isObject(obj){
                    if(Object.prototype.toString.call(obj) === '[object Object]'){
                        return true
                    }else{
                        return false
                    }
                }
    
                
                filterObj(data){
                    // 如果不是对象则结束
                    if(!Observer.isObject(data)){
                        return
                    }
                    for(const key in data){
                        // 过滤对象上面的属性
                        if(data.hasOwnProperty(key)){
                            const value = data[key]
                            // 如果data的属性值为对象
                            if(Observer.isObject(data[key])){
                                new Observer(data[key])
                            }
                            this.watch(key,value)
                        }
                    }
                }
    
                watch(k,v){
                    Object.defineProperty(this.data,k,{
                        enumerable:true,
                        configurable:true,
                        get:function(){
                            console.log(`${k}`, ' -- 被访问')
                            return v
                        },
                        set:function(newval){
                            console.log(`${k}`,'-- 发生变化')
                            console.log('新值为 : ',JSON.stringify(newval))
                            // 当值发生改变时候修改页面元素中的内容
                            box.innerHTML = newval
                            // 先清空元素中的内容
                            hobby.innerHTML=''
                            createLi(newval)
                            // 是否是一个对象
                            if(Observer.isObject(newval)){
                                new Observer(newval)
                            }
                            v = newval
                        }
                    })
                }
            }
        
            let obj = {
                num:2048,
                hobby:['唱歌','睡觉','打豆豆'],
                equipment:{
                    arms:'kuku',
                    armgurd:'lobg'
                }
            }
            
            box.innerHTML = obj.num;
            hobby.innerHTML = ''
            function createLi (arr){
                for(let i in arr){
                    hobby.innerHTML += `<li>${arr[i]}</li>`
                }
            }
            createLi(obj.hobby)
            let ss = new Observer(obj)
            console.log(ss);
            
            
           
        </script>
        
    </body>
    </html>
  • 相关阅读:
    ReportMachine打印条形码的问题
    性能测试基础知识
    jmeter请求参数中文乱码及无法读取CSV文件解决办法
    soapui学习
    java环境变量和查看安装路径
    python字典中显示中文
    Jmeter做webservices接口测试
    windows 上robot framework 读取sqlite3提示:OperationalError: unable to open database file错误
    c++ 复习练习
    笔记草稿。
  • 原文地址:https://www.cnblogs.com/rose-sharon/p/11699258.html
Copyright © 2020-2023  润新知