JS 代理第一篇:在代理中使用反射

news2025/1/12 17:42:29

理解代理的概念

有过 java 或者 c# 经验的同学,比较容易理解代理的概念和作用,可以类比类中的 setter 和 getter 没有相关经验,读完下面内容,也可以初步理解JS中的代理了 有下面一个对象

const duck = {name: 'Maurice',color: 'white', 
} 

我们可以像下面这样操作对象中的属性

// 获取属性
duck.name
// 设置属性
duck.name = 'John' 

但是如果我们有其他要求,上面的方式就很难满足了,如

  • 限制name属性的赋值,如长度必须为10个字符以下
  • 获取属性时,希望加上额外的内容

这时候就可以使用代理 具体用法是,为目标对象(duck)定义一个关联的代理对象,而这个代理对象可以作为抽象的目标对象来使用,在对目标对象的各种操作影响到目标对象之前,可以在代理对象中对这些操作加以控制 下面通过案例讲解上面的内容

创建代理对象

首先通过空代理理解代理的概念 首先创建一个对象

// 获取属性
duck.name
// 设置属性
duck.name = 'John' 

然后创建一个代理对象,并通过代理对象操作目标对象的属性

const duck = {name: 'Maurice',color: 'white', 
}
// 创建代理对象
const handler={}
// 创建代理
const proxy = new Proxy(duck,handler)
// 通过代理获取属性
console.log(proxy.name);
// 通过代理为属性设置值
proxy.name = 'John'
console.log(proxy.name); 

上面创建的是一个空的代理对象,即代理对象中没有任何捕获器

定义捕获器

创建代理的主要目标就是可以定义捕获器,每个代理对象中可以定义0个或多个捕获器 捕获器就是拦截器,当通过代理访问目标对象的属性或者方法时,当这些操作传播到目标对象之前,捕获器就会先调用,从而拦截修改相应的代码 下面定义一个 get 捕获器,当通过proxy[property]proxy.property等方式访问目标对象属性时,就会触发 get 捕获器

上面的get不获取返回了固定内容’hello’,所以当通过代理访问任何一个属性时,返回的值都是 hello 我们希望访问不同的属性,get 捕获器中就不能返回固定值,这个可以通过捕获器参数实现,也可以通过后面说的反射实现

捕获器参数

所有捕获器都可以访问相应的参数,比如 get 捕获器可以接受目标对象、要查询的属性和代理对象三个参数

这里要记住,三个参数分别是

  • 目标对象:也就是设置代理的对象 duck
  • 要查询的属性,也就是第17行中,通过代理访问的目标对象的属性 name
  • 代理对象

这里重点理解前两个参数,这对于理解后面的反射代码很有帮助

将 get 捕获器修改如下,就可以做到,访问什么属性,就返回什么属性的值

const duck = {name: 'Maurice',color: 'white', 
}
// 创建代理对象
const handler={get(trapTarget,property,receiver){// 重点是这里return trapTarget[property]}
}
// 创建代理
const proxy = new Proxy(duck,handler)
// 通过代理访问目标对象属性时,首先会被get捕获器拦截,捕获器其实就是一个函数,函数的返回值就是 prox.property的返回值
console.log(proxy.name); // Maurice
console.log(proxy.color); // white 

为什么使用代理

看到上面的代码,有些人难免有所疑惑,直接访问对象的属性不香吗?为什么一定要套一层代理呢? 其实,get 捕获器本身就是函数,我们自然可以在函数中编写代码,对属性的访问进行控制,这一点通过 set 捕获器应该更容易理解 set 捕获器会在设置属性值的操作中被调用,接受四个参数

  • 目标对象
  • 设置值的属性
  • 设置的值
  • 代理对象

通过上面的代码,大家就理解了,在代理的捕获器中可以对值进行控制,而通过目标对象直接为属性设置值,是无法控制的

duck.age=200 // 无法进行控制 

反射的应用

反射的概念在如 java、c# 等语言中早已存在

反射的核心概念是在程序运行当中,对于任何一个类,都知道这个类的所有属性和方法;对于任何一个对象,都能够调用它的任意属性和方法

这里的关键之处在于程序运行当中可以获取对象的属性或者方法,如果没有实际的应用场景,就很难理解反射的概念,这里先掌握住反射的用法即可

这里只简单学习 get 方法的使用

**Reflect.get()**方法与从 对象 (target[propertyKey]) 中读取属性类似,但它是通过一个函数执行来操作的。

const duck={name:'Mary'
}

console.log(Reflect.get(duck,'name')); 

上面代码从对象 duck 中读取属性 name 的值,并作为函数的返回值

如果你对展开运算符和函数参数 arguments 了解的话,上面划线的代码改成这样也是可以的

代码可以再简单一点

总结

至此,我们对代理的基本概念和使用,以及反射的基本概念和使用有了一个初步的了解,这是后续学习的重要基础

最后

最近还整理一份JavaScript与ES的笔记,一共25个重要的知识点,对每个知识点都进行了讲解和分析。能帮你快速掌握JavaScript与ES的相关知识,提升工作效率。



有需要的小伙伴,可以点击下方卡片领取,无偿分享

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

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

相关文章

iOS WeexSDK 如何将 Vue 文件绘制成原生UI

废话开篇:现在的跨平台开发尤其是以 vue 语法为主的 uniapp 框架,可以实现 vue 语法直接转换为原生 UI 组件的功能(.nvue 文件),可以理解成 .nvue 文件下的标签与 weex 库的原生注册的 UI 有对应的映射关系&#xff0c…

String类详解(java)

文章目录📖前言:🎀String类的构造方法两种创建形式🪅**隐式创建:**🪅**显式创建:**🎀String类底层结构:🎀String类常用方法:📖前言&am…

神经网络漫谈(一):科普篇

神经网络漫谈(一):科普篇 发表时间: 2023年1月6日创作地点:湖北省武汉市作者:ixy_com&[Bill Kromydas]封面图片来源:Towards Data Science 1、背景 基本概念:神经网络,也称为人工神经网络 (ANN) 或…

Ubuntu22.04安装Docker以及Docker安装微信、企业微信、Docker常用命令

Ubuntu22.04安装Docker以及Docker安装微信、企业微信、Docker常用命令1 Docker引擎官网安装1.1 访问Docker官网下载社区版引擎并按照官网指导进行初步安装1.2 检查安装是否成功1.3 添加当前用户到docker组,不用每次都输入sudo。2 Docker安装微信2.1 拉取微信镜像2.2…

CSS基础(八)——CSS3新增样式

概述 前面7篇博客记录的所有 CSS 知识,都是 CSS2 版本的功能。 CSS3 在 CSS2 版本的基础上,新增了很多特性,例如边框圆角、动画效果。 在 CSS2 的时代,实现圆角必须要用图片才能实现,而 CSS3 只要一行样式就能实现…

SpringBoot+MySQL(官方案例)

在线文档项目结构 1.源码克隆:git clone https://github.com/spring-guides/gs-accessing-data-mysql.git 2.包含两个项目initial和complete,initial可以根据文档练习完善,complete是完整项目 3.功能描述:构建应用程序&#xff0c…

【jQuery】jQuery基础概念

一、JavaScript库1.仓库可以把很多东西放到这个仓库里面。找东西只需要到仓库里面查找到就可以了。2. JavaScript库即 library,是一个封装好的特定的集合(方法和函数)。从封装一大堆函数的角度理解库,就是在这个库中,封装了很多预…

信息技术 安全技术 密钥管理

声明 本文是学习github5.com 网站的报告而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 前 言 GB/T 17901《信息技术 安全技术 密钥管理》分为六个部分: ——第1部分:框架; ——第2部分:使用对称技术的…

Odoo 16 企业版手册 - 库存管理之库位管理

库存位置 配置和管理Odoo 库存模块中可用位置的平台将帮助您定义仓库中存放产品的地方。在单个仓库中,您可以管理库存的多个位置。从库存模块的「设置」菜单中,您可以激活存储位置功能,如下所示,该功能将帮助您跟踪仓库中的产品位…

为什么使用消息中间件

为什么要使用消息中间件 如有一个电商交易的场景,用户下单之后调用库存系统减库存,然后调用物流系统进行发货,如果刚开始交易,库存,物流都是属于一个系统,那么他们之间就是接口调用。但是随着系统的发展&a…

FRP 内网穿透搭建(无域名)

一、为什么要内网穿透 FRP 可用于内网穿透的高性能的反向代理应用,支持 tcp, udp, http, https 协议。 使用场景:公网服务器监听某个端口等待内网服务器连接,内网服务器连接成功后,用户访问公网的某一个端口,访问的所…

Domino Web应用早就想到了环保

大家好,才是真的好。 前几周我们讲了Notes,上周讲了点管理,这周我们可以讲点开发。 我现在要讲的技术真的很古老,但现在却被越来越多的人提倡。 传统的Notes应用可以很简单地通过浏览器访问,以一个非常简单但又很使…

ESP32设备驱动-MCP9808数字温度传感器驱动

MCP9808数字温度传感器驱动 文章目录 MCP9808数字温度传感器驱动1、MCP9808介绍2、硬件准备3、软件准备4、驱动实现1、MCP9808介绍 MCP9808 数字温度传感器将 -20C 和 +100C 之间的温度转换为精度为 0.5C(最大值)的数字字。 MCP9808 带有用户可编程寄存器,可为温度传感应用…

联力L216装机心得

联力L216装机心得 2022年12月份装机笔记 参考视频 B站硬件茶谈装机:https://www.bilibili.com/video/BV1BG4y137mG/?spm_id_from333.337.search-card.all.click&vd_source8f7bdd23b317e50e9b9803f44de6a213 联力L216机箱介绍:https://www.bilibili.com/vid…

ArcGIS基础实验操作100例--实验57由点坐标生成面要素

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台:ArcGIS 10.6 实验数据:请访问实验1(传送门) 高级编辑篇--实验57 由点坐标生成面要素 目录 一、实验背景 二、实验数据 三、实验步骤 (…

【Qt】自动查找Qt应用程序缺少的依赖库

【Qt】自动查找Qt应用程序缺少的依赖库1、背景2、实例3、验证1、背景 操作系统:windows10专业版,如下图: Qt版本:qt-opensource-windows-x86-msvc2013_64-5.7.1.exe 使用Qt安装后的qtcreator5.7.1开发Qt应用程序。 将编译生成的…

基于Vue和SpringBoot的超市账单管理系统的设计和实现

作者主页:Designer 小郑 作者简介:Java全栈软件工程师一枚,来自浙江宁波,负责开发管理公司OA项目,专注软件前后端开发(Vue、SpringBoot和微信小程序)、系统定制、远程技术指导。CSDN学院、蓝桥云…

【练习】Day03(未完成版)

努力经营当下,直至未来明朗! 文章目录一、选择二、编程1. 括号生成2. 颜色分类答案1. 选择2. 编程提普通小孩也要热爱生活! 一、选择 下列Java代码中的变量a、b、c分别在内存的____存储区存放。 class A {private String a “aa”;public…

SpringBoot+JPA(官方案例)

在线文档项目结构 1.源码克隆:git clone https://github.com/spring-guides/gs-accessing-data-jpa.git 2.包含两个项目initial和complete,initial可以根据文档练习完善,complete是完整项目 3.功能描述:构建应用程序,使…

相机标定中的战斗机--张氏标定法

张正友标定法--相机标定中的灭霸!在上学期接触过calibration以后,下定决心要学一下张正友标定法的,然后没来的及学,寒假弥补一下。参考博客:https://zhuanlan.zhihu.com/p/136827980编辑切换为居中添加图片注释&#x…