美文网首页Web 前端开发 让前端飞
利用 proxy 监视对象的变化

利用 proxy 监视对象的变化

作者: jackPan | 来源:发表于2017-12-21 14:35 被阅读17次

vue 对于 mvvm 的实现是基于 Object.defineProperty 来实现的,
对于 es6 而言有另外一种类似的监视对象属性变化的 api, 即使用代理 Proxy

对于这个 api 不熟悉的开发者可以点击这里

利用 porxy 代理对象的 get, defineProperty, deleteProperty
方法即可实现,代码简洁明了

const watch = (object, onChange) => {
   const handler = {
       /*  
           如果 target[property] 为对象时递归代理,否则返回属性值
           @param {object} target
           @param {string} property
           @param {object} [receiver]
       */
       get (target, property, receiver) {
           try {
               return new Proxy(target[property], handler)
           } catch (err) {
               return Reflect.get(target, property, receiver)
           }
       },
       
       /*
           当对象赋值的时候,触发的代理方法(如果有 set 代理, 则触发 set 代理,否则触发该方法)
           @param {object} target
           @param {string} property
           @param {object} descriptor
       */
       defineProperty (target, property, descriptor) {
           onChange() // 赋值时触发回调函数
           return Reflect.defineProperty(target, property, descriptor)
       },
       
       /*
           当删除对象属性时触发的代理方法
           @param {object} target
           @param {string} property
       */
       deleteProperty (target, property) {
           onChange() // 删除属性时触发回调函数
           return Reflect.deleteProperty(target, property)
       }
   }
   
   return new Proxy(object, handler)
}

// demo
let obj = {
   a: 123,
   b: {
       c: 333
   }
}
let i = 0
let watchObj = watch(obj, () => {console.log('Object changed:', ++i)})
watchObj.a = 333
// => 'Object changed: 1'
watchObj.b.c = 444
//=> 'Object changed: 2'

参考链接

相关文章

  • 利用 proxy 监视对象的变化

    vue 对于 mvvm 的实现是基于 Object.defineProperty 来实现的,对于 es6 而言有另...

  • Proxy和Reflect

    Proxy Proxy可以监听到对象内部操作的变化,比如对象或数组的增查改删。相对于Object.definePr...

  • 2020-03-27 Proxy与Object.definePr

    Proxy的优势: 可以直接监听对象而非属性可以直接监听数组的变化拦截方式较多Proxy返回一个新对象,可以只操作...

  • 2020-03-27 Proxy与Object.definePr

    Proxy的优势: 可以直接监听对象而非属性可以直接监听数组的变化拦截方式较多Proxy返回一个新对象,可以只操作...

  • Proxy 对象学习

    1、Proxy 对象到底是什么? Proxy 对象到底是什么呢?Proxy 的意思是 代理,proxy对象的作用是...

  • zabbix_proxy 代理

    一.zabbix_proxy 监视tomcat 1.基础配置 2.proxy代理配置文件 (1)zabbix-s...

  • Condition源码分析

    Java对象都有一组监视器方法:wait,notify,notifyAll,而synchronized本身就是利用...

  • Vue源码学习之一:监听数据对象变化

    监听数据对象变化,最容易想到的是建立一个需要监视对象的表,定时扫描其值,有变化,则执行相应操作,不过这种实现方式,...

  • 代理模式——对象结构型模式

    定义   代理(proxy)模式 ,应用非常广泛的一种结构型设计模式,而且变化很多,代理对象可以在客户对象和目标对...

  • C++中替身类(Proxy Class)的运用

    替身对象(Proxy Objects)指的是用来代表其他对象的对象,而用以表现替身对象的就是替身类(Proxy C...

网友评论

    本文标题:利用 proxy 监视对象的变化

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