1. let obj = {
  2. page: 5
  3. }
  4. let pro = new Proxy(obj, {
  5. // target:目标访问的对象属性
  6. // propKey:访问属性的键名
  7. // value:访问属性的键值
  8. // receiver:属性的原始值
  9. // 重写set方法后,如果不在方法内通过target[key]修改源对象属性值,则源对象和proxy对象的属性值都不会变化,也就是永远等于初始值
  10. // 所以只要拦截处理后,通过target修改源对象即可,proxy对象内会随之改变
  11. set: (target,propKey,value,receiver)=>{
  12. console.log(target);
  13. console.log(propKey);
  14. console.log(value);
  15. console.log(receiver);
  16. target[propKey] = value //也可以做别的处理,比如 value + 10
  17. },
  18. // 如果重写get方法后,如果没有return任何值,访问对象属性值显示undefined
  19. // get中return的值就是用户最终访问该属性的值,即使不是真正的值
  20. get: (target,propKey,reveiver)=>{
  21. return 1 //return 1 代表用户访问这个obj对象的属性时,永远只能获得 1
  22. }
  23. })
  24. pro.page = pro.page + 2
  25. console.log(pro.page);

通过重写set方法实现一个监听器

Vue的响应式也是这样实现的

  1. let pageNum = 1; // 当前页码,默认页码1
  2. const pagination = document.getElementById('pagination') // 表示页数/当前页的DOM元素
  3. // 用一个代理对象包装页码,用于监听值的变化
  4. let page = new Proxy({ pageNum }, {
  5. set: (target, key, value) => {
  6. // 如果值发生变化,则修改页面上的数据
  7. pagination.innerText = `共 ${maxPage} 页,当前 ${value} 页`
  8. target[key] = value //记得一定要修改源对象的属性值,才会影响proxy对象
  9. }
  10. })