Proxy

概述

Proxy 可以理解成,在目标对象之前架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写。Proxy 这个词的原意是代理,用在这里表示由它来“代理”某些操作,可以译为“代理器”。

Object.defineProperty是使用的数据劫持:直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象

在访问或者修改对象的某个属性时,通过一段代码拦截这个行为,进行额外的操作或者修改返回结果。数据劫持最典型的应用 -----> 双向的数据绑定(一个常用的面试题),

  • Vue 2.x 利用 Object.defineProperty(),并且把内部解耦为 Observer, Dep, 并使用 Watcher 相连
  • Vue3.x 版本之后改用 Proxy 进行实现

ProxyObject.defineProperty的对比

  • Object.defineProperty

    • 只能监听对象(Object),不能监听数组的变化,无法触发push, pop, shift, unshift,splice, sort, reverse
    • 必须遍历对象的每个属性
    • 只能劫持当前对象属性,如果想深度劫持,必须深层遍历嵌套的对象
复制代码
"use strict"
let obj = {};
let value = 1
Object.defineProperty(obj, 'listenA', {
  writable: true,  //可修改
  enumerable: true,  // 可枚举   for...in...   Object.keys()
  configurable: true,  // 可配置,可删除
  get: () => value,
  set: val => {
    console.log(`set obj.listenA .. ${val}`);
    value = val
  },
});
obj.listenA = 2 //set obj.listenA .. 2
console.log(obj.listenA)  // 2
复制代码

Proxy

  • 可以直接监听对象而非属性
  • 可以直接监听数组的变化
复制代码
// 代理整个对象
let proxyObj = new Proxy({}, {
  get: (target, key, receiver) => {
    console.log(`getting ${key}!`);
    return target[key];
  },
  set: (target, key, value, receiver) => {
    console.log(target, key, value, receiver);
    return target[key] = value;
  },
});
proxyObj.val = 1;    // {} val 1 {}
proxyObj.val;       // getting val!

//代理数组
let proxyArr = new Proxy([], {
  get: (target, key, receiver) => {
    console.log(`getting ${key}!`);
    return target[key];
  },
  set: (target, key, value, receiver) => {
    console.log(target, key, value, receiver);
    return (target[key] = value);
  },
});
proxyArr[0] = 1; //  {} val 1 {}
console.log(proxyArr[0]); //  getting val!  // 1
console.log(proxyArr); // [1]
复制代码

 


posted @   Magi黄元  阅读(118)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示