当前位置: 首页 > web >正文

JavaScript 中的 Proxy 与 Reflect 教程

目录

get 和 set 捕获器详解

为什么要用 Reflect?

          使用语法间接调用内部方法

 使用 Reflect 直接调用内部方法

对比总结:

Reflect API 及其与 Proxy 的配合

Proxy 的典型应用场景


Proxy 是 ES6 引入的一种元编程特性。它允许创建一个代理对象来包装目标对象,并拦截对目标对象的各种操作(如属性读取、写入、枚举、函数调用等),从而可以自定义这些操作的行为。语法上,new Proxy(target, handler) 接受两个参数:第一个是要代理的目标对象,第二个是包含各种“捕获器”(traps)的处理器对象。例如,get 捕获器可以拦截属性读取操作,set 捕获器拦截属性写入操作等等。如果处理器中定义了对应的捕获器,就会在操作发生时被触发;否则,操作会默认直接作用于目标对象。Proxy 机制被广泛用于框架和库中,比如 Vue3 的响应式系统就是基于 Proxy 实现的

get 和 set 捕获器详解

handler 中可以定义不同的捕获器来拦截操作。其中最常用的是 getset

  • get(target, property, receiver):拦截属性读取操作,当访问 proxy.property 时触发。参数说明为

    • target:目标对象(被代理的原始对象)。

    • property:被读取的属性名。

    • receiver:通常是当前访问该属性时的 this 值(通常就是代理对象本身,或者如果继承自该代理的对象,则是继承对象)。如果该属性是一个 getter,那么 receiver 就是执行 getter 时的 this

  • set(target, property, value, receiver):拦截属性写入操作,当执行 proxy.property = value 时触发。参数说明为

    target:目标对象。
    • property:被写入的属性名。

    • value:写入的值。

    • receiver:与 get 类似,对应 setter 被调用时的 this
      set 捕获器应该返回一个布尔值,true 表示写入成功,false 表示失败(失败时会抛出 TypeError

例如,以下代码演示了一个带有 getset 捕获器的 Proxy 用法:

const person = {name: "张三",get aliasName() {return this.name + "handsome";},
};
const proxyPerson = new Proxy(person, {get(target, key, receiver) {console.log("get", key);return Reflect.get(target, key, receiver);},set(target, key, value) {console.log(`set ${key} = ${value}`);return Reflect.set(target, key, value);},
});
console.log(person.aliasName);       // 张三handsome
console.log(proxyPerson.aliasName);  // 输出:get aliasName \n 张三handsome
proxyPerson.name = "李四";           // 输出:set name = 李四
console.log(proxyPerson.aliasName);  // 输出:get aliasName \n 李四handsome
 

上例中&#

http://www.xdnf.cn/news/3874.html

相关文章:

  • 比特、字节与布尔逻辑:计算机数据存储与逻辑运算的底层基石
  • PMP-第四章 项目整合管理(一)
  • 享元模式(Flyweight Pattern)
  • MOS管极间电容参数学习
  • spring中的@ComponentScan注解详解
  • stm32week14
  • 主机电路安全防护系统哪个厂家做
  • 招聘绩效效果评估方案与优化路径
  • 35、C# 中的反射(Reflection)
  • 深入理解 Spring MVC:DispatcherServlet 与视图解析机制​
  • 快速弄懂POM设计模式
  • 1991年-2023年 上市公司-重污染企业数据 -社科数据
  • GitHub 趋势日报 (2025年05月03日)
  • 多模态大语言模型arxiv论文略读(五十九)
  • STM32教程:ADC原理及程序(基于STM32F103C8T6最小系统板标准库开发)*详细教程*
  • 数电填空题整理(适用期末考试)
  • Linux网络编程:套接字
  • C++类_匿名类
  • 从入门到登峰-嵌入式Tracker定位算法全景之旅 Part 2 |蜂窝 LBS on Tracker:从 AT 命令到定位结果
  • 今天python练习题
  • MYSQL-联合查询
  • 【前端】【总复习】HTML
  • 基于 ESP32 和 GC9D01 0.71寸TFT屏幕的逼真眼睛与写轮眼动态显示
  • Spring Boot Jpa封装快速构建Specification、OrderBy、Pageable的查询条件
  • 【Python】一直没搞懂生成器是什么。。
  • 【25软考网工】第五章(5)ICMP和ICMPv6、NDP、IP组播技术和MPLS
  • JavaScript基础-分支流程控制
  • strstr()和strpbrk()函数的区别
  • 学习黑客开源情报
  • Go语言接口实现面对对象的三大特征