关于代理模式我所知道的

简介: 关于代理模式我所知道的

image.png


本文已参与「新人创作礼」活动,一起开启掘金创作之路。

关键词: 结构型 拦截 接受控制 Proxt get/set Reflect

一图胜千言


代理模式是一种结构型设计模式。由代理控制对原对象的访问,并允许在将请求提交给对象前后进行一些处理(副作用:数据校验,数据格式化)。


JS 代理模式长什么样?


在 JS 中,可以使用 Proxy 来控制与对象的交互。不直接操作对象,而是通过代理实现基本操作的拦截。

JS 也提供了 Reflect 内置对象。为什么使用 Reflect 呢?

大多数情况直接用对象就满足需求了,如果遇到 target 上也存在 get/set,那就建议使用 Reflect , 并把 reciever 传递到方法中。可以在对象的拦截器上做一些校验 validation,格式化 formatting 等副作用。

Proxy 创建代理对象,Reflect 替代原始操作(访问/赋值)。


const person = {
  name: "kanelogger",
  age: 18,
  sex: 'male'
};
const personProxy = new Proxy(person, {
  get: (obj, prop, receiver) => {
    // const str = `属性 ${prop} 的值 ${obj[prop] || '不存在'}`;
    const str = `属性 ${prop} 的值 ${Reflect.get(obj, prop, receiver) || '不存在'}`
    Reflect.has(obj, prop) // 检测一个对象是否存在特定属性
    Reflect.ownKeys(obj); // Object.keys 
    console.log(str);
  },
  set: (obj, prop, value, receiver) => {
    if (prop === 'age' && typeof value !== 'number') {
      console.log('年纪必须是数字');
      return false
    } else if (!obj[prop]) {
      Reflect.set(obj, prop, value, receiver); // 添加新属性
      return false
    }
    // Reflect.deleteProperty(obj, prop) // 删除属性
    console.log(`属性 ${prop} 的值从 ${obj[prop]} 变为 ${value}`);
    obj[prop] = value;
  }
});
personProxy.name // 触发 handle.get 属性 name 的值 kanelogger
personProxy.cb // 触发 handle.get 属性 cb 的值 不存在
personProxy.age = '12' // 触发 handle.set 年纪必须是数字
personProxy.age // 18
personProxy.age = 29 // 触发 handle.set 属性 age 的值从 18 变为 29
console.log(`person.age: ${person.age}`) // 29

image.png

顺便说一句:

Reflect 的场景下,receiver 可以改变计算属性中 this 的指向。Reflect.get(obj, prop, {xx: 'xx'})

Proxy 的场景下,这个 receiver 永远指向 Proxy 本身或者继承它的对象。

参考资料

MDN Proxy

MDN Reflect

patterns Proxy

目录
相关文章
|
12月前
|
传感器 数据采集 监控
物联网 GE-PREDIX
GE-Predix 是一个由通用电气公司开发的工业互联网平台,旨在为工业设备提供连接、分析和管理服务。它支持设备数据的收集与分析,帮助企业优化运营效率,实现智能化转型。
|
人工智能 机器人
多模态大模型活动 | 使用 PAI×LLaMA Factory 搭建文旅问答机器人
LLaMA Factory 是一款开源低代码大模型微调框架,集成了业界最广泛使用的微调技术,支持通过 Web UI 界面零代码微调大模型,目前已经成为开源社区内最受欢迎的微调框架,GitHub 星标超过3万。本次活动通过 PAI×LLaMA Factory 微调 Qwen2-VL 模型,快速搭建文旅领域知识问答机器人,期待看到您与 AI 导游的创意对话!
|
安全 网络安全 数据库
CISP-PTE靶机
本文档详细记录了一次针对Windows 2003服务器的渗透测试过程。测试环境包括攻击机(Kali Linux,IP: 192.168.18.130)和靶机(Windows 2003,IP: 192.168.18.145),两者需处于同一局域网内。测试过程中,通过Nmap扫描发现靶机开放了SQL Server端口,进一步利用信息泄露、文件上传漏洞及数据库连接等方式,逐步获取了系统的控制权限,最终实现了远程桌面连接。文中还提供了多种技术细节和操作命令,帮助读者理解每一步的具体实现方法。
368 0
CISP-PTE靶机
|
12月前
|
存储 算法 安全
深入理解Linux内核的内存管理机制
本文旨在深入探讨Linux操作系统内核的内存管理机制,包括其设计理念、实现方式以及优化策略。通过详细分析Linux内核如何处理物理内存和虚拟内存,揭示了其在高效利用系统资源方面的卓越性能。文章还讨论了内存管理中的关键概念如分页、交换空间和内存映射等,并解释了这些机制如何协同工作以提供稳定可靠的内存服务。此外,本文也探讨了最新的Linux版本中引入的一些内存管理改进,以及它们对系统性能的影响。
|
DataWorks 大数据 API
DataWorks常见问题之弹内API 服务不可用Server unreachable如何解决
DataWorks是阿里云提供的一站式大数据开发与管理平台,支持数据集成、数据开发、数据治理等功能;在本汇总中,我们梳理了DataWorks产品在使用过程中经常遇到的问题及解答,以助用户在数据处理和分析工作中提高效率,降低难度。
284 1
|
JavaScript Python
7-4|execjs._exceptions.ProgramError: Error: Cannot find module 'jsdom'
7-4|execjs._exceptions.ProgramError: Error: Cannot find module 'jsdom'
|
机器学习/深度学习 人工智能 数据挖掘
Numba是一个Python库,用于对Python代码进行即时(JIT)编译,以便在硬件上高效执行。
Numba是一个Python库,用于对Python代码进行即时(JIT)编译,以便在硬件上高效执行。
|
存储 安全 Linux
C++文件格式深度解析:从底层结构到关键特性
C++文件格式深度解析:从底层结构到关键特性
854 3
C++文件格式深度解析:从底层结构到关键特性
|
JSON 数据格式 Python
flask 接收get请求, 以及返回 json格式
flask 接收get请求, 以及返回 json格式
254 0
|
API 调度
【FreeRTOS】信号量的使用
【FreeRTOS】信号量的使用
264 0