J*aScript代理模式_拦截器实现


Proxy是ES6提供的代理对象,通过new Proxy(target, handler)创建代理,拦截属性访问、赋值、函数调用等操作。例如:get陷阱可记录读取日志或返回默认值;set陷阱可用于数据验证与响应式更新;apply陷阱能监控函数调用参数与结果;has和deleteProperty可控制私有属性安全。实际中可用于实现自动认证请求拦截、AOP切面编程等。需注意仅能代理对象、存在性能开销及兼容性限制。结合Reflect可增强代理完整性。

javascript代理模式_拦截器实现

J*aScript 中的代理模式通过 Proxy 构造函数实现,可以对对象的操作进行拦截和自定义处理。这种机制非常适合用来实现拦截器,比如在访问属性、修改属性、调用方法等操作前加入逻辑控制、日志记录、权限校验等。

什么是 Proxy 代理

Proxy 是 ES6 引入的一个内置对象,用于创建一个对象的代理,从而实现基本操作的拦截和自定义。语法如下:

const proxy = new Proxy(target, handler);

target:要被代理的对象。
handler:一个对象,定义了代理的行为(即拦截器),比如 get、set、apply 等陷阱(traps)。

常见拦截操作示例

下面是一些常用的拦截方式及其应用场景:

1. 拦截属性读取(get)

当访问对象属性时触发,可用于数据绑定、默认值返回、日志输出等。

const user = { name: 'Alice', age: 25 }; const proxyUser = new Proxy(user, { get(target, property) { console.log(`读取属性: ${property}`); return target[property] ?? '未知'; } }); console.log(proxyUser.name); // 输出:读取属性: name → Alice console.log(proxyUser.gender); // 输出:读取属性: gender → 未知

2. 拦截属性设置(set)

当设置属性值时触发,适合做数据验证、更新视图、通知机制等。

const data = {}; const reactiveData = new Proxy(data, { set(target, property, value) { console.log(`设置属性 ${property} 为 ${value}`); target[property] = value; // 可在此处触发 UI 更新或事件通知 return true; } }); reactiveData.count = 1; // 输出:设置属性 count 为 1 reactiveData.count++; // 输出:设置属性 count 为 2

3. 拦截函数调用(apply)

简单库存管理系统 简单库存管理系统

本系统是一个基于工厂模式的三层架构项目,基于VS2005 开发,结构简洁,配合动软Codematic代码生成器,可以使开发效率事半功倍,倍感轻松。本系统主要功能 1,物品类别管理 实现了物品类别的添加、修改、删除功能,方便库存物品分类管理。 2,物品管理 实现物品添加、修改,管理员可实时对物品做出库、入库记录,也可查看详细历史出入库记录。 3,商家管理 实现商家添加、修改、删除功能,方便公司和客户

简单库存管理系统 0 查看详情 简单库存管理系统

适用于代理函数,可以在函数执行前后插入逻辑,如参数校验、耗时统计等。

function sum(a, b) { return a + b; } const trackedSum = new Proxy(sum, { apply(target, thisArg, args) { console.log('函数被调用,参数:', args); const result = target.apply(thisArg, args); console.log('结果:', result); return result; } }); trackedSum(2, 3); // 输出: // 函数被调用,参数: [2, 3] // 结果: 5

4. 拦截 in、deleteProperty 等操作

可以控制属性是否可枚举、可删除等。

const securedObj = { _secret: '私密信息', public: '公开信息' }; const secureProxy = new Proxy(securedObj, { has(target, prop) { if (prop.startsWith('_')) return false; return prop in target; }, deleteProperty(target, prop) { if (prop.startsWith('_')) { console.log('禁止删除私有属性'); return false; } delete target[prop]; return true; } }); console.log('_secret' in secureProxy); // false delete secureProxy._secret; // 输出:禁止删除私有属性

实际应用:简易请求拦截器

可以用 Proxy 模拟一个 API 请求对象,在每次调用方法前自动添加认证头或日志记录。

const apiClient = { getUser(id) { return `用户 ${id} 的数据`; }, post(data) { return `提交数据: ${JSON.stringify(data)}`; } }; const authHeader = 'Bearer token123'; const interceptedApi = new Proxy(apiClient, { get(target, prop) { const originalMethod = target[prop]; if (typeof originalMethod === 'function') { return function(...args) { console.log(`[请求拦截] 调用 ${prop}, 参数:`, args); console.log(`[添加认证头] ${authHeader}`); return originalMethod.apply(this, args); }; } return originalMethod; } }); console.log(interceptedApi.getUser(1)); // 输出: // [请求拦截] 调用 getUser, 参数: [1] // [添加认证头] Bearer token123 // 用户 1 的数据

这种方式可以作为轻量级 AOP(面向切面编程)实现,无需修改原始逻辑即可增强功能。

注意事项与局限性

使用 Proxy 时需要注意以下几点:

  • 只能代理对象或函数,不能代理原始值(如字符串、数字)。
  • 某些操作无法被完全拦截,例如绕过代理直接操作原对象。
  • 性能开销存在,频繁操作大量属性时需评估影响。
  • 部分浏览器兼容性需要考虑(现代浏览器普遍支持)。

基本上就这些。Proxy 提供了强大的元编程能力,合理使用可以让代码更灵活、可维护性更高。拦截器模式只是冰山一角,结合 Reflect 可以构建更完整的代理逻辑。不复杂但容易忽略细节。

以上就是J*aScript代理模式_拦截器实现的详细内容,更多请关注其它相关文章!


# react  # javascript  # es6  # java  # js  # 代理模式  # 加载  # 淘宝商务网站建设方案  # 统计图  # 山西太原网站推广外包  # 邵通营销推广费用多少  # 山西公司网站优化  # 营销推广小游戏有哪些  # 网站建设投标函  # 新闻网站推广机构热线  # 营销推广程序图表设计  # 网站的优化 设计与实现  # 淘宝客推广一个网站  # 是一个  # 时需  # 默认值  # 本系统  # 可用于  # 自定义  # 库存管理系统  # 拦截器  # red  # proxy  # app  # 浏览器  # json 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 多闪APP官方下载安装入口_多闪最新版本获取入口  抖音视频如何添加标题?添加标题有哪些好处?  《U校园》学生登录入口2025  优化2xN网格最大路径和的动态规划算法实践  《爱笔思画x》涂色教程  阿里云共享相册入口在哪  Keras中Convolution2D层及其核心辅助层详解  c++如何掌握指针的核心用法_c++指针入门到精通指南  Eclipse开发J*a快速入门  vivo云服务一直提示空间不足怎么办 怎么办vivo云服务老是提示空间不足  解决Pandas DataFrame高度碎片化警告:高效创建多列的策略  word邮件合并怎么插入个性化图片_Word邮件合并插入个性化图片方法  AO3中文版手机快速通道_AO3最新稳定链接更新  红手指专业版app注册教程  sublime如何配置PHP开发环境_在sublime中运行与调试PHP代码  c++类和对象到底是什么_c++面向对象编程基础  J*aScript模块加载器_RequireJS原理分析  Flask 应用中图片动态更新与上传:实现客户端定时刷新与服务器端文件管理  Dagster资产间数据传递与用户配置管理教程  抖音网页版地址直接进入_抖音网页版在线观看入口  苹果手机如何清理系统缓存数据 iPhone非越狱清理垃圾文件的技巧【系统优化】  Pandas中基于动态偏移量实现DataFrame列值位移的策略  Animex动漫社正版在线入口 Animex动漫社动漫官方观看网  纯CSS实现自适应宽度与响应式布局的水平按钮组  《新三国志曹操传》游历事件袁尚突围攻略  向日葵客户端怎么进行语音通话_向日葵客户端语音通话功能使用方法  poki官网最新入口 poki小游戏大全入口  mysql导入sql文件能分批导入吗_mysql分批次导入大sql文件的实用技巧  PDF如何批量加注释_PDF多文件批注高亮操作教程  抖音网页版官方链接 抖音网页版官网链接入口  PHP中获取HTTP响应状态消息:方法与限制  《暗黑破坏神4》国服回归送狂欢礼包 价值6916元  PHP动态导航按钮:根据用户登录状态切换链接与文本  济南公交卡手机充值指南  如何用Golang优化微服务间请求性能_Golang 微服务请求性能优化方法  《三角洲行动》战斗步枪与机枪类改装代码分享  J*aScript实现下拉菜单驱动的动态表格数据展示  composer licenses 命令:如何检查项目依赖的许可证?  电脑开不了机怎么办 电脑无法开机的解决方法  第五人格PC版怎么避免被封号_第五人格PC版防封号注意事项  sublime怎么在文件中显示代码结构大纲_sublime符号列表功能  微信朋友圈怎么设置三天可见 微信朋友圈设置指定天数可见步骤【教程】  Golang如何使用crypto/md5生成哈希_Golang MD5哈希生成方法  电脑从睡眠中被自动唤醒怎么办_Windows唤醒源事件查看与禁用【解决】  todesk如何添加信任设备_todesk信任设备设置教程  CDR如何复制交互式填充色  教资成绩怎么查询  LocoySpider如何批量采集电商商品_LocoySpider电商采集的模板应用  《盗墓笔记手游》技能介绍  如何发挥新媒体矩阵作用?新媒体矩阵怎么搭建? 

 2025-11-26

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.