关于代理模式我所知道的

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

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

目录
相关文章
|
5月前
|
设计模式 缓存 Java
适配器模式与代理模式的区别
【8月更文挑战第22天】
268 0
|
6月前
|
设计模式
对于装饰器模式与代理模式的个人理解
摘要: 代理模式与装饰器模式虽相似,但目的不同。装饰器动态增强对象功能,如添加新特性,而不改变原有类。代理模式则用于控制访问,如优化昂贵操作或添加辅助服务(如日志),它可能在内部初始化原对象。用法上,装饰器由外部决定是否应用,允许链式创建,而代理通常内部调用,外部直接与代理交互,被代理对象可能独立不可用。
|
8月前
|
缓存 Java 数据安全/隐私保护
关于代理模式的相关配置方法
关于代理模式的相关配置方法
41 0
|
8月前
|
缓存 数据安全/隐私保护 C++
【C++】—— 代理模式
【C++】—— 代理模式
代理模式——为他人做嫁衣裳
代理模式——为他人做嫁衣裳
|
8月前
|
Java Spring
代理模式
代理模式
60 0
|
Java 网络安全 Maven
代理模式的运用
代理模式的运用
70 0
|
Java Spring
代理模式你了解多少
代理模式你了解多少
86 0
|
设计模式 缓存 监控
我学会了,代理模式
代理模式属于结构型模式,这个类型的设计模式总结出了 类、对象组合后的经典结构,将类、对象的结构和使用解耦了,花式的去借用对象。
103 0
我学会了,代理模式
|
存储 设计模式 缓存
万洋-什么是代理模式
简介: 影视导演找演员谈合作一般是不会直接找到演员本人,而是先找到演员的经纪人,先由经纪人洽谈,经纪人觉得合适的话就会与演员本人商讨合作事项,这个过程导演与演员是不直接接触的。 这里就用到了**代理模式**,导演其实想找的人是演员,但是要先找到是经纪人,再由经纪人找演员沟通。真正的价值在于演员,但是这个过程中,对于导演来说,经纪人与演员体现出了同样的价值,经纪人会全权代理演员与导演洽谈,经纪人会用自己的专业性过滤掉一些不好的合作意向,从而避免演员被频繁打扰。
135 0
万洋-什么是代理模式