
js代理模式理解和应用场景
发布日期:2021-05-07 09:30:34
浏览次数:25
分类:精选文章
本文共 2045 字,大约阅读时间需要 6 分钟。
代理模式的理解
代理模式(Proxy Pattern)是一种设计模式,用于为其他对象提供一种代理以控制对象的访问。这种模式常用于隔离对象,避免直接访问目标对象,同时通过代理来进行授权和控制。
代理模式的特点
- 使用者无权访问目标对象:代理模式通过中间代理实现对目标对象的访问控制,确保使用者无法直接操作目标对象。
- 中间加代理,通过代理做授权和控制:代理类在与目标对象交互时,执行必要的权限检查和操作控制,确保所有操作符合业务逻辑。
代理模式的典型场景
购票系统中的黄牛代理
在买火车票的过程中,黄牛相当于我们本人的代理。通过黄牛购买票,我们可以避免与火车站的直接交互,省去很多繁琐的步骤,同时还能享受到黄牛提供的更好的服务(前提是支付金额足够)。
网页事件代理
在前端开发中,网页事件代理是一种常见的模式。通过事件代理,我们可以将多个子元素的事件处理逻辑集中到父元素上,减少代码冗余。例如,通过将事件代理到父元素,可以统一处理多个子元素的点击、鼠标过渡等事件。
jQuery代理
在 jQuery 中,.proxy()
方法可以用来代理函数的调用。这种方式特别适用于在 setTimeout 或其他异步操作中,无法直接访问外层 this
的场景。通过 jQuery 的代理方法,可以避免传递大量的函数参数,同时还能保持函数的灵活性。
ES6 Proxy 代理
ES6 引入了 Proxy 代理语法,提供了更简洁的代理实现方式。通过定义 getter 和 setter,可以对目标对象的属性和方法进行控制。例如,可以创建一个代理对象,限制某些属性的访问或设置特定的值。
代理模式的类图
传统类图
传统的代理模式通常表现为以下类图结构:
- Image 接口:顶层接口,定义了共有方法(如
display()
)。 - RealImage 类:实现 Image 接口的实际图片类,负责加载和显示图片。
- ProxyImage 类:实现 Image 接口的代理类,负责对 RealImage 的操作进行授权和控制。
简化的 JavaScript 类图
在 JavaScript 中,代理类与被代理类的方法完全一致:
class Realimg { constructor(fileName) { this.fileName = fileName; this.load(); } display() { console.log(`显示图片:${this.fileName}`); } load() { console.log(`正在加载:${this.fileName}`); }}class ProxyImg { constructor(fileName) { this.proxy = new Realimg(fileName); } display() { this.proxy.display(); }}const proxyImg = new ProxyImg('libi.jpg');proxyImg.display();
Proxy 代理的语法示例
const actor = { name: 'JkChen', phone: '12312312333', price: 1000};const agent = new Proxy(actor, { get(target, key) { if (key === 'phone') { return '经纪人电话:111111111111'; } if (key === 'price') { return 2; } return target[key]; }, set(target, key, value) { if (key === 'setPrice' && value < 2) { console.log('价格不能低于 2 元'); } else { target[key] = value; return true; } }});console.log(agent.name); // JkChenconsole.log(agent.phone); // 经纪人电话:111111111111console.log(agent.price); // 2 元actor.setPrice = 1;
代理模式的优势
- 开放封闭原则:代理模式允许在不修改目标类的前提下,扩展和修改代理类的行为,符合开放封闭原则。
- 解耦:通过引入代理层,实现了对目标对象的解耦,使系统结构更加清晰,减少了耦合度。
- 灵活性:代理模式允许定义不同的代理逻辑,支持多种不同的代理行为,提高系统的灵活性。
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年05月22日 18时32分48秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
mac book 安装MySQL
2025-04-11
mac elasticsearch brew安装填坑
2025-04-11
Mac m1 tensorflow 内核似乎挂掉了,它很快将自动重启
2025-04-11
mac M1 下安装docker 及相关镜像
2025-04-11
Mac M1 安装 TensorFlow 使用Python3.8
2025-04-11
Mac M1 芯片不兼容node-sass
2025-04-11
MAC M1大数据0-1成神篇-25 hadoop高可用搭建
2025-04-11
mac m1安装MySQL
2025-04-11
mac m1导入cv2报错 正确的安装OpenCV的方法
2025-04-11
Mac mini7.1 2014年末 安装单windows 10系统
2025-04-11
Mac mini7.1 2014年末系统损坏开机跳出闪动带问候文件夹
2025-04-11
mac node版本管理
2025-04-11
Mac OS 12.0.1 如何安装柯美287打印机驱动,刷卡打印
2025-04-11
Mac os X lion Python MysqlDB
2025-04-11
Mac OS X 上 Python 的框架和非框架构建之间的差异
2025-04-11
Mac OS X 中的 virtualenv 问题
2025-04-11
Mac OS X下Sublime Text (V2.0.1)破解
2025-04-11
Mac OS X汇编语言常识
2025-04-11
Mac os 如何安装SVN
2025-04-11