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

《JavaScript高级程序设计》读书笔记 34 - 代理基础

感谢点赞、关注和收藏!

上一篇类,这一篇进入书的第 9 章 - 代理与反射,首先是代理基础。

代理基础

        代理是目标对象的抽象。从很多方面看,代理类似 C++指针,因为它可以用作目标对象的替身,但又完全独立于目标对象。目标对象既可以直接被操作,也可以通过代理来操作。但直接操作会绕过代理施予的行为。
创建空代理
        代理是使用 Proxy 构造函数创建的。这个构造函数接收两个参数:目标对象和处理程序对象。缺少其中任何一个参数都会抛出 TypeError。要创建空代理,可以传一个简单的对象字面量作为处理程序对象,从而让所有操作畅通无阻地抵达目标对象。
        如下面的代码所示,在代理对象上执行的任何操作实际上都会应用到目标对象。唯一可感知的不同就是代码中操作的是代理对象。
const target = {id: "target",
};
const handler = {};
const proxy = new Proxy(target, handler);
// id 属性会访问同一个值
console.log(target.id); // target
console.log(proxy.id); // target
// 给目标属性赋值会反映在两个对象上
// 因为两个对象访问的是同一个值
target.id = "foo";
console.log(target.id); // foo
console.log(proxy.id); // foo
// 给代理属性赋值会反映在两个对象上
// 因为这个赋值会转移到目标对象
proxy.id = "bar";
console.log(target.id); // bar
console.log(proxy.id); // bar
// hasOwnProperty()方法在两个地方
// 都会应用到目标对象
console.log(target.hasOwnProperty("id")); // true
console.log(proxy.hasOwnProperty("id")); // true
// Proxy.prototype 是 undefined
// 因此不能使用 instanceof 操作符
console.log(target instanceof Proxy); // TypeError: Function has non-object prototype 'undefined' in instanceof check
console.log(proxy instanceof Proxy); // TypeError: Function has non-object prototype 'undefined' in instanceof check
// 严格相等可以用来区分代理和目标
console.log(target === proxy); // false
定义捕获器
        使用代理的主要目的是可以定义捕获器(trap)。捕获器就是在处理程序对象中定义的“基本操作的拦截器”。每个处理程序对象可以包含零个或多个捕获器,每个捕获器都对应一种基本操作,可以直接或间接在代理对象上调用。每次在代理对象上调用这些基本操作时,代理可以在这些操作传播到目标对象之前先调用捕获器函数,从而拦截并修改相应的行为。
下面我们举个例子来应用 get() 捕获器:
const target = { foo: 'bar' 
}; 
const handler = { // 捕获器在处理程序对象中以方法名为键get() { return 'handler override'; } 
}; 
const proxy = new Proxy(target, handler); 
console.log(target.foo); // bar 
console.log(proxy.foo); // handler override 
console.log(target['foo']); // bar 
console.log(proxy['foo']); // handler override 
console.log(Object.create(target)['foo']); // bar 
console.log(Object.create(proxy)['foo']); // handler override
捕获器参数和反射 API
http://www.xdnf.cn/news/737731.html

相关文章:

  • 【术语扫盲】BSP与MSP
  • FreeRTOS多任务系统①
  • Vector - VT System - 板卡_VT板卡使用介绍目录
  • 【Redis】hash
  • LevelDB、BoltDB 和 RocksDB区块链应用比较
  • 前端基础之《Vue(17)—路由集成》
  • 【C/C++】无限长有序数组中查找特定元素
  • 语音通信接通率、应答率和转化率有什么区别?
  • (20)Java 在 AI ML 领域应用
  • Spring AI开发跃迁指南(第二章:急速上手5——Spring AI 结构化输出源码级原理详解及使用实例)
  • 电动飞行器(eVTOL)动力测试实验室系统方案
  • JavaScript正则表达式
  • 精通 Kubernetes:从故障排除到化繁为简
  • MySql--定义表存储引擎、字符集和排序规则
  • 前端面试题目-高频问题集合
  • 用OLEDB读取EXCEL时,单元格内容长度超过255被截断
  • 痉挛性斜颈相关内容说明
  • 换行符在markdown格式时异常2
  • 智能化能源管理系统在“双碳”背景下的新价值
  • 本地部署Ollama DeepSeek-R1:8B,接入Cherry Studio
  • 优先队列用法
  • [正点原子]ESP32S3 RGB屏幕移植LVGL
  • 基本数据指针的解读-C++
  • 数据即资产:GEO如何重塑企业的信息价值链
  • 电子电路:D触发器的工作原理及应用详解
  • 在Mathematica中使用WhenEvent求解微分方程
  • java代码性能优化
  • MODIS火点数据下载
  • 人工智能时代Agent与MCP区别联系
  • 001在线拍卖系统技术揭秘:构建高效交互的竞拍平台