【JavaScript】用 Proxy 拦截对象属性

目录

一、Proxy 的基本结构(打地基)

二、最常用的两个拦截方法:get 和 set

1. get(target, key)

2. set(target, key, value)

三、说到这,那就可以回到题目来

四、什么是 Reflect?

总结不易,本章节对我有很大的收获,希望对你也是!!!! 


本节素材已上传至Gitee:web练习: web页面练习 有很多很多很多的素材 - Gitee.comhttps://gitee.com/liu-yihao-hhh/web-practice/tree/master/proxy

先设想 假设当我们设置好一个自定义的对象,但是我们不要直接操控对象里的属性,而是每次当用户重新定义一个对象的时候,都会通过一种办法进行数据拦截,然后想办法设置一下里面的数据,把对象里面的内容加以限制,在进行输出返回给用户设置的对象岂不是一桩好事!

let person = {age: 0,
};

比如 “你家门口装了一扇自动门(Proxy),不符合条件的人(属性操作)不能进屋(不能改属性)”。

那么这里先留下一个悬念来设置一个题目,对该对象进行数据拦截,实现:

  • 如果新属性值在 0 -150 之间(包含 0 和 150),则直接更新。
  • 如果新属性值小于 0,则属性值更新为 0。
  • 如果新属性值大于 150,则属性值更新为 150。

蓝桥账户中心https://www.lanqiao.cn/problems/2332/learning/?page=2&first_category_id=2&second_category_id=11

// 请不要更改这个对象里面的内容
let person = {age: 0,
};
// TODO:在这里写入具体的实现逻辑
// 对 person 的 age 属性更新行为进行拦截
// 如果输入的年龄在 0 - 150 之间,则认为是合法
// 否则,如果小于 0,则返回 0;如果大于 150,则返回 150

一、Proxy 的基本结构(打地基)

const 代理对象 = new Proxy(目标对象, 配置对象);
const proxy = new Proxy(target, handler);
  • 目标对象(target):就是你要“加保镖”的原始对象,比如 { age: 0 }

  • 配置对象(handler):这个对象里放的是你想拦截哪些操作,比如读取属性、设置属性

二、最常用的两个拦截方法:getset

1. get(target, key)

这个方法在你访问某个属性时触发:

const obj = { name: 'lyh' }const proxy = new Proxy(obj, {get(target, key) {console.log('1', target) // {name: 'lyh}console.log('2', key) // nameconsole.log('3', target[key]) // lyhreturn target[key]}
})console.log('4', proxy.name) // 'lyh'
  • target 是原始对象 { name: "lyh" }

  • key 是当前访问的属性,比如 "name"

2. set(target, key, value)

这个方法在你给属性赋值时触发:

const obj = { name: 'lyh' }const proxy = new Proxy(obj, {get(target, key) {console.log('1', target) // {name: 'lyh}console.log('2', key) // nameconsole.log('3', target[key]) // lyhreturn target[key]},set(target, key, value) {console.log('5', target)console.log('6', key)console.log('7', value)target[key] = value // 把key属性的值进行修改return true // 设置成功}
})console.log('4', proxy.name) // 'lyh'
proxy.name = 'hha'
console.log('4', proxy.name) // 'hha'

  • target 是原始对象;

  • key 是被赋值的属性名;

  • value 是要赋的值。

三、说到这,那就可以回到题目来

  • 如果新属性值在 0 -150 之间(包含 0 和 150),则直接更新。
  • 如果新属性值小于 0,则属性值更新为 0。
  • 如果新属性值大于 150,则属性值更新为 150。
// 请不要更改这个对象里面的内容
let person = {age: 0,
};
// TODO:在这里写入具体的实现逻辑
// 对 person 的 age 属性更新行为进行拦截
// 如果输入的年龄在 0 - 150 之间,则认为是合法
// 否则,如果小于 0,则返回 0;如果大于 150,则返回 150person = new Proxy(person, {get(target, key) {return target[key]},set(target, key, value) {if(value > 150) target[key] = 150else if(value < 0) target[key] = 0else target[key] = valuereturn true}
})

只需要直接对该对象进行修改并赋值即可,然后再set方法内写上判断条件,能够完成这题的判断!

四、什么是 Reflect?

你可以把 Reflect 理解为一个官方提供的工具库,专门用于安全、标准地操作对象。

target[key] = value;           // 普通写法
Reflect.set(target, key, value); // 更安全写法

Reflect.set(target, key, value) 是“官方提供的设置方法”,多了一层保护,比如你设置失败它会给你 false,不会直接报错。

person = new Proxy(person, {get(target, key) {return Reflect.get(target, key)},set(target, key, value) {if(value > 150) Reflect.set(target, key, 150)else if(value < 0) Reflect.set(target, key, 0)else Reflect.set(target, key, value)return true}
})

只需要将所有的target[key] = value 修改成Reflect.set(target, key, value)即可,函数会自动帮我们生成对应的方法的

总结不易,本章节对我有很大的收获,希望对你也是!!!! 

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

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

相关文章

[IMX] 02.GPIO 寄存器

目录 手册对应章节 1.GPIO 复用&#xff08;引脚功能选择&#xff09;- IOMUXC_SW_MUX_CTL_PAD_xxx 2.GPIO 电气特性 - IOMUXC_SW_PAD_CTL_PAD_xxx 3.GPIO 数据与控制寄存器 3.1.数据 - DR 3.2.输入/输出选择 - GDIR 3.3.状态 - PSR 3.4.中断触发控制 - ICR 3.5.中断使…

Tomcat 配置 HTTPS 访问全攻略(CentOS 环境)

Tomcat 配置 HTTPS 访问全攻略&#xff08;CentOS 环境&#xff09; 一、环境说明 操作系统&#xff1a;CentOS Tomcat 版本&#xff1a;Apache Tomcat/9.0.105 服务器 IP&#xff1a;192.168.1.35 目标&#xff1a;将 Tomcat 默认的 HTTP 访问升级为 HTTPS&#xff0c;提…

Flink 运维监控与指标采集实战(Prometheus + Grafana 全流程)

一、引言:为什么 Flink 运维监控如此重要? 在实时计算场景中,Flink 作业 724 小时运行,对性能、资源、故障感知、状态变化的实时监控非常关键。没有有效的运维可观测体系: 不知道任务是否在稳定运行 发生问题难以快速定位 无法感知背压、延迟、反压等状态 因此,构建完善…

【prometheus+Grafana篇】基于Prometheus+Grafana实现Oracle数据库的监控与可视化

&#x1f4ab;《博主主页》&#xff1a; &#x1f50e; CSDN主页 &#x1f50e; IF Club社区主页 &#x1f525;《擅长领域》&#xff1a;擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控&#xff1b;并对SQLserver、NoSQL(MongoDB)有了…

【数据仓库面试题合集③】实时数仓建模思路与实践详解

实时数据仓库已经成为各大企业构建核心指标监控与业务实时洞察的基础能力。面试中,关于实时建模的题目频繁出现,尤其聚焦于建模思路、宽表设计、状态管理、乱序处理等方面。本文整理典型题目及答题思路,帮助你应对相关考察。 一、建模原则与数仓分层认知 1. 实时数仓与离线…

鸿蒙PC操作系统:从Linux到自研微内核的蜕变

鸿蒙PC操作系统是否基于Linux内核,需要结合其技术架构、发展阶段和官方声明综合分析。以下从多个角度展开论述: 一、鸿蒙操作系统的多内核架构设计 多内核混合架构 根据资料,鸿蒙操作系统(HarmonyOS)采用分层多内核架构,内核层包含Linux内核、LiteOS-m内核、LiteOS-a内核…

LabVIEW数据库使用说明

介绍LabVIEW如何在数据库中插入记录以及执行 SQL 查询&#xff0c;适用于对数据库进行数据管理和操作的场景。借助 Database Connectivity Toolkit&#xff0c;可便捷地与指定数据库交互。 各 VI 功能详述 左侧 VI 功能概述&#xff1a;实现向数据库表中插入数据的操作。当输入…

【docker】--docker file编写教程

文章目录 构建docker file 镜像常用命令速查表一、基础指令&#xff08;指定镜像和执行命令&#xff09;二、构建上下文管理三、设置镜像内部环境四、容器运行配置五、多阶段构建&#xff08;可选进阶&#xff09; 构建docker file 镜像 # -f 指定dockerfile # -t 镜像名和tag…

WeakAuras Lua Script <BiaoGe>

WeakAuras Lua Script <BiaoGe> 表格拍卖插件WA字符串 表格字符串代码&#xff1a; !WA:2!S3xA3XXXrcoE2VH9l7ZFy)C969PvDpSrRgaeuhljFlUiiSWbxaqXDx(4RDd0vtulB0fMUQMhwMZJsAO5HenLnf1LPSUT4iBrjRzSepL(pS)e2bDdWp5)cBEvzLhrMvvnAkj7zWJeO7mJ8kYiJmYiImYF0b(XR)JR9JRD…

虚幻引擎5-Unreal Engine笔记之什么时候新建GameMode,什么时候新建关卡?

虚幻引擎5-Unreal Engine笔记之什么时候新建GameMode,什么时候新建关卡&#xff1f; code review! 参考笔记&#xff1a; 1.虚幻引擎5-Unreal Engine笔记之GameMode、关卡&#xff08;Level&#xff09; 和 关卡蓝图&#xff08;Level Blueprint&#xff09;的关系 2.虚幻引擎…

开源模型应用落地-模型上下文协议(MCP)-Resource Template-资源模板的使用逻辑(六)

一、前言 在数字化进程加速的今天,如何高效管理动态资源已成为开发者们的核心课题。Resource Template(资源模板)作为Model Context Protocol(MCP)中的关键机制,正通过参数化设计重新定义资源调用的边界——它不仅是静态数据的容器,更是动态上下文生成的引擎。与传统的R…

uniapp小程序获取手机设备安全距离

utils.js let systemInfo null;export const getSystemInfo () > {if (!systemInfo) {systemInfo uni.getSystemInfoSync();// 补充安全区域默认值systemInfo.safeAreaInsets systemInfo.safeAreaInsets || {top: 0,bottom: 0,left: 0,right: 0};// 确保statusBarHei…

【线下沙龙】NineData x Apache Doris x 阿里云联合举办数据库技术Meetup,5月24日深圳见!

5月24日下午&#xff0c;NineData 将联合 Apache Doris、阿里云一起&#xff0c;在深圳举办数据库技术Meetup。本次技术沙龙聚焦「数据实时分析」与「数据同步迁移」 两大核心领域&#xff0c;针对企业数据战略中的痛点&#xff0c;特邀行业资深技术大咖&#xff0c;结合多年技…

企业网站架构部署与优化 --web技术与nginx网站环境部署

一、Web 基础 本节将介绍Web 基础知识,包括域名的概念、DNS 原理、静态网页和动态网页的 相关知识。 1、域名和DNS 1.1、域名的概念 网络是基于TCP/IP 协议进行通信和连接的&#xff0c;每一台主机都有一个唯一的标识(固定的IP 地址),用以区别在网络上成千上万个用户和计算机。…

java实现poi-ooxml导出Excel的功能

文章目录 1. 添加poi-ooxml依赖2. Excel导出工具类3.核心逻辑说明4.扩展建议5.HSSF、XSSF、SXSSF 的核心原则和场景建议&#xff0c;帮助你在不同需求下快速决策&#xff1a; 以下是一个基于 Apache POI 实现的简单、通用的Java导出Excel工具类&#xff0c;代码逻辑清晰且注释详…

Nginx端口telnet不通排查指南

nginx已经配置server及端口20002&#xff0c;telnet不通&#xff1a;telnet 127.0.0.1 20002 Trying 127.0.0.1... telnet: connect to address 127.0.0.1: Connection refused 一、检查 systemctl status nginx.service nginx: [emerg] bind() to 0.0.0.0:20002 failed (13…

【RabbitMQ】消息丢失问题排查与解决

RabbitMQ 消息丢失是一个常见的问题&#xff0c;可能发生在消息的生产、传输、消费或 Broker 端等多个环节。消息丢失的常见原因及对应的解决方案&#xff1a; 一、消息丢失的常见原因 1. 生产端&#xff08;Producer&#xff09;原因 (1) 消息未持久化 原因&#xff1a;生产…

docker默认存储迁移

在容器化场景下默认存储路径为&#xff08;/var/lib/docker&#xff09;大多数平台根目录不支持系统盘扩容&#xff0c;会有空间不足风险隐患&#xff0c;因未配置持久化存储导致容器数据丢失。以迁移Docker存储路径至大容量/data目录说明 一、停止容器 systemctl stop docke…

【Golang笔记02】函数、方法、泛型、接口学习笔记

Golang笔记02&#xff1a;函数、方法、泛型、接口学习笔记 一、进阶学习 1.1、函数 go中的函数使用func关键字进行定义&#xff0c;go程序的入口函数叫做&#xff1a;main&#xff0c;并且必须是属于main包里面。 1.1.1、定义函数 &#xff08;1&#xff09;普通函数 go中…

LLM笔记(九)KV缓存调研

KV 缓存 (Key-Value Cache) 技术详解 KV 缓存&#xff08;Key-Value Cache&#xff09;是在 Transformer 模型&#xff08;尤其是 Decoder-Only 架构或 Encoder-Decoder 架构的 Decoder 部分&#xff09;进行自回归 (auto-regressive) 推理生成序列时&#xff0c;一种至关重要…