JavaScript 中的 Proxy 與 Reflect 教程

目錄

get 和 set 捕獲器詳解

為什么要用 Reflect?

          使用語法間接調用內部方法

 使用 Reflect 直接調用內部方法

對比總結:

Reflect API 及其與 Proxy 的配合

Proxy 的典型應用場景


Proxy 是 ES6 引入的一種元編程特性。它允許創建一個代理對象來包裝目標對象,并攔截對目標對象的各種操作(如屬性讀取、寫入、枚舉、函數調用等),從而可以自定義這些操作的行為。語法上,new Proxy(target, handler) 接受兩個參數:第一個是要代理的目標對象,第二個是包含各種“捕獲器”(traps)的處理器對象。例如,get 捕獲器可以攔截屬性讀取操作,set 捕獲器攔截屬性寫入操作等等。如果處理器中定義了對應的捕獲器,就會在操作發生時被觸發;否則,操作會默認直接作用于目標對象。Proxy 機制被廣泛用于框架和庫中,比如 Vue3 的響應式系統就是基于 Proxy 實現的

get 和 set 捕獲器詳解

handler 中可以定義不同的捕獲器來攔截操作。其中最常用的是 getset

  • get(target, property, receiver):攔截屬性讀取操作,當訪問 proxy.property 時觸發。參數說明為

    • target:目標對象(被代理的原始對象)。

    • property:被讀取的屬性名。

    • receiver:通常是當前訪問該屬性時的 this 值(通常就是代理對象本身,或者如果繼承自該代理的對象,則是繼承對象)。如果該屬性是一個 getter,那么 receiver 就是執行 getter 時的 this

  • set(target, property, value, receiver):攔截屬性寫入操作,當執行 proxy.property = value 時觸發。參數說明為

    target:目標對象。
    • property:被寫入的屬性名。

    • value:寫入的值。

    • receiver:與 get 類似,對應 setter 被調用時的 this
      set 捕獲器應該返回一個布爾值,true 表示寫入成功,false 表示失敗(失敗時會拋出 TypeError

例如,以下代碼演示了一個帶有 getset 捕獲器的 Proxy 用法:

const person = {name: "張三",get aliasName() {return this.name + "handsome";},
};
const proxyPerson = new Proxy(person, {get(target, key, receiver) {console.log("get", key);return Reflect.get(target, key, receiver);},set(target, key, value) {console.log(`set ${key} = ${value}`);return Reflect.set(target, key, value);},
});
console.log(person.aliasName);       // 張三handsome
console.log(proxyPerson.aliasName);  // 輸出:get aliasName \n 張三handsome
proxyPerson.name = "李四";           // 輸出:set name = 李四
console.log(proxyPerson.aliasName);  // 輸出:get aliasName \n 李四handsome
 

上例中&#

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/79427.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/79427.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/79427.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于STM32的心電圖監測系統設計

摘要 本論文旨在設計一種基于 STM32 微控制器的心電圖監測系統,通過對人體心電信號的采集、處理和分析,實現對心電圖的實時監測與顯示。系統采用高精度的心電信號采集模塊,結合 STM32 強大的數據處理能力,能夠有效去除噪聲干擾&a…

C語言----操作符詳解(萬字詳解)

目錄 1. 操作符的分類 2. 二進制和進制轉換 3. 原碼 反碼 補碼 4. 移位操作符 4.1 左移操作符 >> 4.2 右移操作符 >> 5. 位操作符 5.1 按位與 & 5.2 按位或 | 5.3 按位異或 ^ 5.4 按位取反 ~ 練習 整數存儲在內存中二進制中1的個數 練習 二進制位…

【進階】C# 委托(Delegate)知識點總結歸納

1. 委托的基本概念 定義:委托是一種類型安全的函數指針,用于封裝方法(靜態方法或實例方法)。 核心作用:允許將方法作為參數傳遞,實現回調機制和事件處理。 類型安全:委托在編譯時會檢查方法簽…

WebRTC 服務器之Janus視頻會議插件信令交互

1.基礎知識回顧 WebRTC 服務器之Janus概述和環境搭建-CSDN博客 WebRTC 服務器之Janus架構分析-CSDN博客 2.插件使用流程 我們要使?janus的功能時&#xff0c;通常要執?以下操作&#xff1a; 1. 在你的??引入 Janus.js 庫&#xff0c;即是包含janus.js&#xff1b; <…

Go語言中的無鎖數據結構與并發效率優化

1. 引言 在高并發系統開發中&#xff0c;性能瓶頸往往出現在并發控制上。作為一個有著10年Go開發經驗的后端工程師&#xff0c;我見證了無數因鎖競爭導致的性能問題&#xff0c;也親歷了無鎖編程為系統帶來的巨大提升。 傳統的鎖機制就像是十字路口的紅綠燈——雖然能確保安全…

STM32部分:2、環境搭建

飛書文檔https://x509p6c8to.feishu.cn/wiki/DQsBw76bCiWaO4kS8TXcWDs0nAh Keil MDK用于編寫代碼&#xff0c;編譯代碼芯片支持包&#xff0c;用于支持某類芯片編程支持STM32CubeMX用于自動生成工程&#xff0c;減少手動重復工作 STM32F1系列芯片支持包 軟件下載 直接下載&am…

U3D工程師簡歷模板

模板信息 簡歷范文名稱&#xff1a;U3D工程師簡歷模板&#xff0c;所屬行業&#xff1a;其他 | 職位&#xff0c;模板編號&#xff1a;B29EPQ 專業的個人簡歷模板&#xff0c;邏輯清晰&#xff0c;排版簡潔美觀&#xff0c;讓你的個人簡歷顯得更專業&#xff0c;找到好工作。…

Java設計模式: 實戰案例解析

Java設計模式: 實戰案例解析 在軟件開發中&#xff0c;設計模式是一種用來解決特定問題的可復用解決方案。它們是經過實踐驗證的最佳實踐&#xff0c;能夠幫助開發人員設計出高質量、易于維護的代碼。本文將介紹一些常見的Java設計模式&#xff0c;并通過實戰案例解析它們在實際…

Vue3源碼學習5-不使用 `const enum` 的原因

文章目錄 前言? 什么是 const enum? 為什么 Vue 3 不使用 const enum1. &#x1f4e6; **影響構建工具兼容性**2. &#x1f501; **難以做模塊間 tree-shaking**3. &#x1f9ea; **調試困難**4. &#x1f4e6; **Vue 是庫&#xff0c;不掌控用戶配置** ? 官方推薦做法&…

C++學習:六個月從基礎到就業——C++11/14:lambda表達式

C學習&#xff1a;六個月從基礎到就業——C11/14&#xff1a;lambda表達式 本文是我C學習之旅系列的第四十篇技術文章&#xff0c;也是第三階段"現代C特性"的第二篇&#xff0c;主要介紹C11/14中引入的lambda表達式。查看完整系列目錄了解更多內容。 引言 Lambda表達…

AIDC智算中心建設:計算力核心技術解析

目錄 一、智算中心發展概覽 二、計算力核心技術解析 一、智算中心發展概覽 智算中心是人工智能發展的關鍵基礎設施&#xff0c;基于人工智能計算架構&#xff0c;提供人工智能應用所需算力服務、數據服務和算法服務的算力基礎設施&#xff0c;融合高性能計算設備、高速網絡以…

IoTDB時序數據庫V2.0.2大版本更新的一些梳理

一些小知識&#xff1a; 關于事務&#xff1a;時序數據庫是沒有事務的&#xff0c;它和關系數據庫的應用場景不同&#xff0c;通常情況下不需要多點同時操作同一條數據&#xff0c;而且要保證極高的吐出量&#xff0c;事務太消耗資源&#xff0c;并且時序數據庫提供了覆寫的功能…

CSS定位詳解

在前端開發中&#xff0c;CSS 定位&#xff08;positioning&#xff09;是一個核心概念&#xff0c;它決定了元素在頁面上的位置和布局方式。無論是構建復雜的交互界面&#xff0c;還是實現簡單的頁面排版&#xff0c;CSS 定位都是不可或缺的工具。本文將全面介紹 CSS 中的五種…

React 語法擴展

useReducer鉤子函數 不同action類型返回不同處理行為 useState()函數返回解構為兩個值 state當前狀態 dispatch修改狀態函數 dispatch()函數參數為一個actuon對象 如 &#xff1a; 樣例&#xff1a; import { useReducer } from react; import ./App.css;// 定義一個Reduce…

MCP協議與Dify集成教程

一、MCP協議概述 MCP&#xff08;Model Control Protocol&#xff09;是一種新興的開放協議&#xff0c;為大型語言模型&#xff08;LLM&#xff09;與外部應用之間構建了雙向通信通道。它就像是AI的"USB-C"接口&#xff0c;幫助模型發現、理解并安全調用各種外部工…

學習springboot-條件化配置@Conditional(條件注解)

前言 在Spring Boot中&#xff0c;Conditional 注解及其相關注解是用于條件化配置的重要工具。它們允許開發者根據特定條件決定是否加載某個Bean或配置類。 注意&#xff1a;Conditional 相關注解&#xff0c;通常和Bean搭配使用 學習springboot-Bean管理&#xff08;Bean 注…

2025年- H18-Lc126-54.螺旋矩陣(矩陣)---java版

1.題目描述 2.思路* 思路1&#xff1a; 補充2&#xff1a; directions[1][0] // 表示“下”這個方向的行增量&#xff08;1&#xff09; directions[1][1] // 表示“下”這個方向的列增量&#xff08;0&#xff09; int[][] directions {{0, 1}, {1, 0}, {0, -1}, {-…

微信小程序連續多個特殊字符自動換行解決方法

效果圖 .wxml <view class"container"><text>沒轉換{{text}}</text><view style"height: 60rpx;" /><text>轉換后{{convert}}</text> </view>.js Page({data: {text:&#xff01;&#xff01;&#xff01;&am…

編程速遞-RAD Studio 12.3 Athens四月補丁:關注軟件性能的開發者,安裝此補丁十分必要

2025年4月22日&#xff0c;Embarcadero發布了針對RAD Studio 12.3、Delphi 12.3以及CBuilder 12.3的四月補丁。此更新旨在提升這些產品的質量&#xff0c;特別關注于Delphi編譯器、C 64位現代工具鏈、RAD Studio 64位IDE及其調試器、VCL庫和其他RAD Studio特性。強烈建議所有使…

Linux 進程基礎(二):操作系統

目錄 一、什么是操作系統&#xff1a;用戶和電腦之間的「翻譯官」&#x1f310; OS 的層狀結構&#x1f9e9; 案例解析&#xff1a;雙擊鼠標的「跨層之旅」 二、操作系統的必要性探究&#xff1a;缺乏操作系統的環境面臨的挑戰剖析&#x1f511; OS 的「管理者」屬性&#xff1…