数据劫持

作者: 姜治宇 | 来源:发表于2020-04-04 16:10 被阅读0次

    es6提供了一个defineProperty的函数,目的是劫持对象的属性,当属性变化时可立即捕获到。

    var o = {name:'jack'}
    defineReactive(o,'name',o['name'])
    o.name = 'tom'
    
    function defineReactive(obj,key,val){
        Object.defineProperty(obj,key,{
            enumerable:true,
            configurable:true,
            get(){
                return val
            },
            set(newval){
                console.log('object属性发生了变化')
                val = newval
            }
        })
    }
    

    这只是最简单的对象,如果是有多重嵌套的呢?

    var o = {a: {b: {c: 'jack'}}}
    

    我们可以采用递归来解决。

    var o = {a: {b: {c: 'jack'}}}
    observe(o)
    o.a.b.c = 'tom'
    
    //利用递归劫持object所有的属性
    function observe(data){
    
        Object.keys(data).forEach(function(key){
    
            if(typeof data[key] === 'object'){
    
                observe(data[key]) //递归
    
            } else{
    
                defineReactive(data,key,data[key]) 
    
            }
    
        })
    }
    
    
    function defineReactive(obj,key,val){
        Object.defineProperty(obj,key,{
            enumerable:true,
            configurable:true,
            get(){
                return val
            },
            set(newval){
                console.log('object属性发生了变化')
                val = newval
            }
        })
    }
    

    相关文章

      网友评论

        本文标题:数据劫持

        本文链接:https://www.haomeiwen.com/subject/adejphtx.html