zoukankan      html  css  js  c++  java
  • 检测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>
  • 相关阅读:
    URI 和 URL
    TCP/IP协议
    TCP/IP 通信传输流
    Python 之 函数可变参数和关键字参数
    Python 之装饰器decorator
    Python 之进程
    Android
    Redis持久化(persistence)
    python正则表达式
    selenium+python定位iframe元素
  • 原文地址:https://www.cnblogs.com/rose-sharon/p/11699258.html
Copyright © 2011-2022 走看看