数据劫持

作者: 姜治宇 | 来源:发表于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
        }
    })
}

相关文章

  • 数据劫持:proxy / defineProperty

    proxy 数据代理、数据劫持 1.自动循环了 2.对象添加数据可以劫持 defineProperty数据劫持 1...

  • 1.3 对象的数据劫持

    observe(data)响应式原理; 数据劫持方法 对对象数据进行数据劫持 把data中的数据都使用Object...

  • 点击劫持ClickJacking

    点击劫持 图片覆盖 拖拽劫持与数据窃取 触屏劫持 防御ClickJackingframe busting可以用,但...

  • 自己动手实现MVVM

    1、数据劫持(vue):通过Object.defineProperty()去劫持数据每个属性对应的getter和s...

  • 个人手写的MVVM

    1.MVVM(入口函数) 为vm添加数据代理 调用其他函数(数据劫持,模版编译) 2.observer(数据劫持)...

  • 数据劫持

    数据驱动视图: 新的问题:无法对新增的属性进行监听 在下面重新监听新的值 特别优待的数组(vue对数组的方法进行了...

  • 数据劫持

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

  • vue 双向数据绑定原理

    vue双向数据绑定采用数据劫持结合系统-订阅者模式的方式,通过Object.defineProperty()来劫持...

  • vue实现双向绑定原理

    原理 vue数据双向绑定通过‘数据劫持’ + 订阅发布模式实现 数据劫持 指的是在访问或者修改对象的某个属性时,通...

  • 24,vue、vuex

    一,谈谈MVVM原理数据劫持 + 发布-订阅者。Object.defineProperty( )劫持getter和...

网友评论

    本文标题:数据劫持

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