什么是proxy

在前端开发中,Proxy是 ES6 引入的一个高级特性,用于拦截和自定义对象的基本操作(如属性访问、赋值、枚举、函数调用等)。它为开发者提供了元编程能力,是实现响应式系统、数据校验、访问控制等功能的核心技术。

一、基本概念

定义
Proxy是一个构造函数,用于创建一个对象的代理,从而可以对该对象的基本操作进行拦截和自定义处理。
语法

const proxy = new Proxy(target, handler);
  • target:需要被代理的对象。
  • handler:包含拦截方法的对象,用于定义如何处理目标对象的操作。
    二、核心拦截方法(常用)
    1.get(target, property, receiver)

    作用:拦截对象属性的读取操作。
    示例

    const person = { name: 'Doubao', age: 25 }; const proxy = new Proxy(person, { get(target, prop) { // 拦截属性读取,添加默认值 return prop in target ? target[prop] : '未知属性'; } }); console.log(proxy.name); // 输出: Doubao console.log(proxy.gender); // 输出: 未知属性
    2.set(target, property, value, receiver)

    作用:拦截对象属性的赋值操作。
    示例

    const validator = { set(target, prop, value) { // 拦截属性赋值,添加校验逻辑 if (prop === 'age') { if (typeof value !== 'number' || value < 0) { throw new Error('年龄必须为正整数'); } } target[prop] = value; return true; // 必须返回 true 表示赋值成功 } }; const person = new Proxy({}, validator); person.age = 25; // 正常赋值 person.age = -5; // 抛出错误
    3.has(target, property)

    作用:拦截in操作符。
    示例

    const handler = { has(target, prop) { // 隐藏以 _ 开头的私有属性 return prop[0] !== '_' && prop in target; } }; const obj = { name: 'Doubao', _secret: 'xxx' }; const proxy = new Proxy(obj, handler); console.log('name' in proxy); // 输出: true console.log('_secret' in proxy); // 输出: false
    4.deleteProperty(target, property)

    作用:拦截delete操作符。
    示例

    const handler = { deleteProperty(target, prop) { // 禁止删除以 _ 开头的私有属性 if (prop[0] === '_') { throw new Error('不能删除私有属性'); } delete target[prop]; return true; } }; const obj = { name: 'Doubao', _secret: 'xxx' }; const proxy = new Proxy(obj, handler); delete proxy.name; // 正常删除 delete proxy._secret; // 抛出错误
    三、应用场景
    1.响应式系统(如 Vue 3)

    Proxy 是 Vue 3 实现响应式数据的核心技术,相比 Vue 2 的Object.defineProperty,它能拦截更多操作,包括新增属性、删除属性等。
    示例

    function reactive(target) { return new Proxy(target, { get(target, prop) { // 收集依赖 track(target, prop); return target[prop]; }, set(target, prop, value) { target[prop] = value; // 触发更新 trigger(target, prop); return true; } }); } const state = reactive({ count: 0 }); // 当 state.count 变化时,自动触发更新
    2.数据校验与格式化

    在赋值时自动校验数据类型或格式。
    示例

    const user = new Proxy({}, { set(target, prop, value) { if (prop === 'email') { const isValid = /^[\w-.]+@([\w-]+\.)+[\w-]{2,4}$/.test(value); if (!isValid) { throw new Error('邮箱格式不正确'); } } target[prop] = value; return true; } }); user.email = 'invalid'; // 抛出错误 user.email = 'valid@example.com'; // 正常赋值
    3.访问控制与私有属性

    通过拦截gethas隐藏内部属性。
    示例

    const privateData = new WeakMap(); class User { constructor(name, age) { privateData.set(this, { name, age }); } get publicInfo() { return new Proxy(privateData.get(this), { get(target, prop) { if (prop === 'age') { return '保密'; // 隐藏真实年龄 } return target[prop]; } }); } } const user = new User('Doubao', 25); console.log(user.publicInfo.name); // 输出: Doubao console.log(user.publicInfo.age); // 输出: 保密
    4.函数参数增强

    拦截函数调用,添加参数校验或日志记录。
    示例

    function logFunction(fn) { return new Proxy(fn, { apply(target, thisArg, args) { console.log(`调用函数 ${target.name},参数:`, args); const result = target.apply(thisArg, args); console.log(`函数返回:`, result); return result; } }); } const add = (a, b) => a + b; const loggedAdd = logFunction(add); loggedAdd(3, 5); // 输出: // 调用函数 add,参数: [3, 5] // 函数返回: 8

    四、Proxy 与 Object.defineProperty 的对比

    五、注意事项

    兼容性:
    Proxy 是 ES6 特性,不支持 IE 浏览器,需通过 Babel 等工具编译或提供降级方案。

    内存管理:
    Proxy 对象会保持对目标对象的引用,可能导致内存泄漏,需注意适时释放。

    递归代理:
    对于嵌套对象,需递归创建 Proxy 才能实现深层拦截。

    Reflect 对象:
    推荐结合 Reflect 对象使用,以保持操作的默认行为:

    const proxy = new Proxy(target, { get(target, prop, receiver) { return Reflect.get(target, prop, receiver); } });

    通过合理使用 Proxy,开发者可以实现更灵活、高效的元编程,提升代码的可维护性和健壮性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1132119.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

收藏这篇就够了!DeepSeek+RAG本地知识库搭建实战,小白也能上手的大模型教程

DeepSeekRAG本地知识库技术结合了DeepSeek大模型与检索增强生成(RAG)技术&#xff0c;旨在构建高效智能的本地化知识库系统。DeepSeek具备强大自然语言处理能力&#xff0c;能理解和生成文本&#xff1b;RAG技术通过结合信息检索和文本生成&#xff0c;使模型在生成文本时可参考…

AI Agent短期记忆完全指南:4种处理长对话问题的方法+代码详解

文章详细介绍了AI Agent的短期记忆机制&#xff0c;分析了长对话引发的上下文丢失、响应变慢等问题&#xff0c;提供了4种解决方案&#xff1a;修剪消息、删除消息、总结消息和自定义策略。通过代码示例展示了如何实现Agent短期记忆&#xff0c;包括基础用法、自定义状态、消息…

Web足球青训俱乐部管理后台系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】

&#x1f4a1;实话实说&#xff1a;用最专业的技术、最实惠的价格、最真诚的态度服务大家。无论最终合作与否&#xff0c;咱们都是朋友&#xff0c;能帮的地方我绝不含糊。买卖不成仁义在&#xff0c;这就是我的做人原则。摘要 随着足球运动的普及和青训体系的不断完善&#xf…

解耦梯度学习解决多模态模型欠优化问题,性能提升超3%

本文揭示了多模态学习中欠优化问题的根本原因在于模态编码器与融合模块间的优化冲突&#xff0c;导致主导模态性能下降。为解决此问题&#xff0c;作者提出解耦梯度学习(DGL)框架&#xff0c;通过截断多模态损失反向传播到编码器的梯度&#xff0c;并引入单模态损失独立优化编码…

2026AI产品经理与大模型学习路线图:从小白到专家的进阶指南

本文详细介绍了AI产品经理的三阶段学习路线&#xff08;基础知识、专业技能、软技能&#xff09;及实践经验积累方法&#xff0c;并提供了大模型学习资源&#xff0c;包括路线图、视频教程、技术文档、面试题等&#xff0c;帮助学习者系统掌握AI产品经理与大模型知识&#xff0…

大模型+知识图谱构建制药业“第二大脑“:从零开始实现企业级知识管理

本文探讨如何利用大语言模型和知识图谱技术构建制药企业级"第二大脑"&#xff0c;整合分散的科研数据与文献为可搜索知识库。通过RAG和Graph-RAG技术实现60%文档审查效率提升&#xff0c;为制药行业创造600-1100亿美元年度价值。文章详解技术架构、实际应用案例、实施…

深入了解移动开发领域 CI_CD 的工作原理

深入了解移动开发领域 CI/CD 的工作原理 关键词:移动开发、CI/CD、持续集成、持续交付、工作原理 摘要:本文旨在深入剖析移动开发领域 CI/CD 的工作原理。首先介绍了 CI/CD 在移动开发中的背景,包括目的、适用读者等信息。接着阐述了 CI/CD 的核心概念与联系,以清晰的文本示…

Claude Code完美平替OpenCode:小白也能轻松上手的AI编程神器

OpenCode是Claude Code的开源平替工具&#xff0c;提供图形化界面&#xff0c;支持多种AI模型&#xff08;包括免费GLM-4.7和MiniMax M2.1&#xff09;。最大亮点是支持多Session并行运行多个Agent&#xff0c;实现协作编程&#xff0c;相比命令行的Claude Code更友好。支持CLI…

打造AI时代智能知识库:Obsidian+Dify向量检索全攻略(附插件下载)

本文详细介绍了如何将Obsidian与Dify知识库相结合&#xff0c;打造基于向量存储的AI友好知识系统。作者开发了自定义同步插件&#xff0c;解决了Obsidian原生搜索对AI不友好的问题&#xff0c;实现了语义检索功能。文章涵盖Dify知识库创建、Embedding模型配置、API密钥获取&…

可视化图解算法77:零钱兑换(兑换零钱)

1.题目 描述 给定数组 coins &#xff0c;coins中所有的值都为正整数且不重复。每个值代表一种面值的货币&#xff0c;每种面值的货币可以使用任意张&#xff0c;再给定一个amount&#xff0c;代表要找的钱数&#xff0c;求组成amount的最少货币数。 如果无解&#xff0c;请…

【毕业设计】SpringBoot+Vue+MySQL ONLY在线商城系统平台源码+数据库+论文+部署文档

&#x1f4a1;实话实说&#xff1a;用最专业的技术、最实惠的价格、最真诚的态度服务大家。无论最终合作与否&#xff0c;咱们都是朋友&#xff0c;能帮的地方我绝不含糊。买卖不成仁义在&#xff0c;这就是我的做人原则。摘要 随着互联网技术的快速发展和电子商务的普及&#…

零代码搭建大模型知识库,5分钟搞定RAG应用,小白也能轻松上手

本文详细介绍如何使用Dify平台零代码搭建大模型知识库&#xff0c;无需编程经验即可实现RAG应用。通过创建Chatflow应用、配置大模型节点、设置知识检索节点和回答问题节点&#xff0c;读者可快速构建一个可用的大模型知识库&#xff0c;深入了解RAG工作流程&#xff0c;提升工…

前后端分离墙绘产品展示交易平台系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程

&#x1f4a1;实话实说&#xff1a;用最专业的技术、最实惠的价格、最真诚的态度服务大家。无论最终合作与否&#xff0c;咱们都是朋友&#xff0c;能帮的地方我绝不含糊。买卖不成仁义在&#xff0c;这就是我的做人原则。摘要 随着数字化时代的快速发展&#xff0c;艺术与科技…

从封闭到通用:RLVR到RLPR的LLM推理强化技术全解析

本文深入解析了强化学习在LLM推理进化中的应用&#xff0c;从依赖外部验证器的RLVR范式&#xff0c;演进到利用模型内在概率的RLPR新方法。重点介绍了1-shot RLVR的高数据效率和RLPR在通用领域的突破&#xff0c;结合verl框架详解工程实现。揭示了GRPO算法的核心作用和熵正则项…

AI Coding时代,程序员的7项核心竞争力,不看可能会被淘汰(建议收藏)

文章探讨了AI编程时代程序员的核心竞争力。尽管AI能帮助编写代码&#xff0c;但程序员的基本功、需求理解、编码规范、协作能力、技术深度和广度、安全生产意识等仍无可替代。在AI时代&#xff0c;程序员应专注于提升自身不可替代的能力&#xff0c;将AI作为提高效率的工具&…

企业级网上租赁系统管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】

&#x1f4a1;实话实说&#xff1a;用最专业的技术、最实惠的价格、最真诚的态度服务大家。无论最终合作与否&#xff0c;咱们都是朋友&#xff0c;能帮的地方我绝不含糊。买卖不成仁义在&#xff0c;这就是我的做人原则。摘要 随着互联网技术的快速发展和共享经济的兴起&#…

从九尾狐AI企业培训案例解析智能矩阵获客的技术架构与实现路径

第一章&#xff1a;智能矩阵获客系统的技术底层逻辑当前企业AI获客解决方案普遍存在两大痛点&#xff1a;一是技术门槛高需专门团队维护&#xff0c;二是内容生产与分发效率低下。九尾狐AI提出的"数字人全域矩阵"架构&#xff0c;本质上是通过三层技术实现低成本自动…

大模型产业链四大层次解析:从算力芯片到行业应用的全面指南

本文解析了大模型产业四大层次架构及核心挑战&#xff1a;基础设施层算力不足&#xff0c;模型层技术代差&#xff0c;中间层标准不统一&#xff0c;应用层人才短缺。提出从产业、科学、工程三维度突破&#xff0c;构建人机协同机制与可信数据平台。核心观点认为超级智能不可避…

xampp-linux-1.8.1.tar.gz 怎么安装?Linux下XAMPP离线安装完整步骤

​一 先准备东西​ 安装包&#xff1a;xampp-linux-1.8.1.tar.gz下载链接&#xff1a;https://pan.quark.cn/s/deec067a4ccf&#xff08;提前下载好&#xff0c;放 /tmp或 /opt目录都行&#xff09;。 权限&#xff1a;用 root​ 或 sudo​ 操作&#xff08;不然解压、启动会报…

【教你用ArcPy批量输出图片并生成Mxd(零门槛小白版)】

如何快速批量出图是GISer需要解决的问题&#xff0c;要实现逐栅格图层或矢量图斑的出图则是师妹最近期末作业遇到的难题。还好&#xff0c;Gemini回归&#xff0c;通过不断调试解决这个需求。希望能转发给更多的伙伴&#xff01;难点1通过现有的Mxd工作空间能够实现逐栅格图层或…