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

《JavaScript高级程序设计》读书笔记 35 - 代理捕获器、反射方法以及代理模式

感谢点赞、关注和收藏!

上一篇基础代理,这一篇继续深入代理相关知识

代理捕获器与反射方法

        代理可以捕获 13 种不同的基本操作。这些操作有各自不同的反射 API 方法、参数、关联ECMAScript 操作和不变式。对于在代理对象上执行的任何一种操作,只会有一个捕获处理程序被调用。不会存在重复捕获的情况
get() 
         get()捕获器会在获取属性值的操作中被调用。对应的反射 API 方法为 Reflect.get()。
const myTarget = {};
const proxy = new Proxy(myTarget, {get(target, property, receiver) {console.log("get()");return Reflect.get(...arguments);},
});
proxy.foo;
// get()
1. 返回值
返回值无限制。
2. 拦截的操作
  • proxy.property
  • proxy[property]
  • Object.create(proxy)[property]
  • Reflect.get(proxy, property, receiver)
3. 捕获器处理程序参数
target:目标对象。
property:引用的目标对象上的字符串键属性(严格来讲,property 参数除了字符串键,也可能是符号(symbol)键)。
receiver:代理对象或继承代理对象的对象。
4. 捕获器不变式
如果 target.property 不可写且不可配置,则处理程序返回的值必须与 target.property 匹配。
如果 target.property 不可配置且[[Get]]特性为 undefined,处理程序的返回值也必须是 undefined。
set()
        set()捕获器会在设置属性值的操作中被调用。对应的反射 API 方法为 Reflect.set()。
const myTarget = {};
const proxy = new Proxy(myTarget, {set(target, property, value, receiver) {console.log("set()");return Reflect.set(...arguments);},
});
proxy.foo = "bar";
// set()
1. 返回值
返回 true 表示成功;返回 false 表示失败,严格模式下会抛出 TypeError。
2. 拦截的操作
  • proxy.property = value
  • proxy[property] = value
  • Object.create(proxy)[property] = value
  • Reflect.set(proxy, property, value, receiver)
3. 捕获器处理程序参数
  • target:目标对象。
  • property:引用的目标对象上的字符串键属性。
  • value:要赋给属性的值。
  • receiver:接收最初赋值的对象。
4. 捕获器不变式
如果 target.property 不可写且不可配置,则不能修改目标属性的值。
如果 target.property 不可配置且[[Set]]特性为 undefined,则不能修改目标属性的值。
在严格模式下,处理程序中返回 false 会抛出 TypeError。
has()
        has()捕获器会在 in 操作符中被调用。对应的反射 API 方法为 Reflect.has()
const myTarget = {};
const proxy = new Proxy(myTarget, {has(target, property) {console.log("has()");return Reflect.has(...arguments);},
});
"foo" in proxy;
// has()
1. 返回值
has()必须返回布尔值,表示属性是否存在。返回非布尔值会被转型为布尔值。
2. 拦截的操作
  • property in proxy
  • property in Object.create(proxy)
  • with(proxy) {(property);}
  • Reflect.has(proxy, property)
3. 捕获器处理程序参数
  • target:目标对象。
  • property:引用的目标对象上的字符串键属性。
4. 捕获器不变式
如果 target.property 存在且不可配置,则处理程序必须返回 true。
如果 target.property 存在且目标对象不可扩展,则处理程序必须返回 true。
defineProperty()
        defineProperty()捕获器会在 Object.defineProperty()中被调用。对应的反射 API 方法为Reflect.defineProperty()。
const myTarget = {};
const proxy = new Proxy(myTarget, {defineProperty(target, property, descriptor) {console.log("defineProperty()");return Reflect.defineProperty(...arguments);},
});
Object.defineProperty(proxy, "foo", { value: "bar" });
// defineProperty()
1. 返回值
defineProperty()必须返回布尔值,表示属性是否成功定义。返回非布尔值会被转型为布尔值。
http://www.lryc.cn/news/609769.html

相关文章:

  • React 19 + Next.js 15 中实现混合布局
  • React配置proxy跨域
  • ref和reactive的区别
  • 通过 Flink 和 CDC 从 Oracle 数据库获取增量数据,并将这些增量数据同步到 MySQL 数据库中
  • [GESP202306 四级] 2023年6月GESP C++四级上机题超详细题解,附带讲解视频!
  • Spring Boot + ShardingSphere 实现分库分表 + 读写分离实战
  • AWS VPC Transit Gateway 可观测最佳实践
  • 【物联网】基于树莓派的物联网开发【23】——树莓派安装SQLite嵌入式数据库
  • 16_OpenCV_漫水填充(floodFill)
  • Nginx vs Spring Cloud Gateway:限流功能深度对比与实践指南
  • Spring Cloud Gateway 实现登录校验:构建统一认证入口
  • 图片的放大缩小选择全屏
  • XSS的原型链污染1--原型链解释
  • 笔记本电脑联想T14重启后无法识别外置红米屏幕
  • Django + Vue 项目部署(1panel + openresty)
  • AI“炼金术”:破解绿色水泥的配方密码
  • 三防平板电脑是什么?这款三防平板支持红外测温!
  • 电脑上不了网怎么办?【图文详解】wifi有网络但是电脑连不上网?网络设置
  • 电脑一键重装系统win7/win10/win11无需U盘(无任何捆绑软件图文教程)
  • Ribbon 核心原理与架构详解:服务负载均衡的隐形支柱
  • 工作流绑定卡片优化用户体验-练习我要找工作智能体
  • 【CVPR2025】计算机视觉|AnomalyNCD:让工业异常分类“脱胎换骨”!
  • transformer与神经网络
  • ubuntu24.01安装odoo18
  • 纯前端使用ExcelJS插件导出Excel
  • 计算机视觉(2)车规摄像头标准
  • 5天挑战网络编程 -DAY1(linux版)
  • python:讲懂决策树,为理解随机森林算法做准备,以示例带学习,通俗易懂,容易理解和掌握
  • 句子表征-文本匹配--representation-based/interactive-based
  • 学习日志27 python