【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.pswp.cn/diannao/83791.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/83791.shtml
英文地址,請注明出處:http://en.pswp.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;一種至關重要…