為什么Vue3的proxy需要Reflect呢

何為proxy

Proxy 對象用于定義或修改某些操作的自定義行為,可以在外界對目標對象進行訪問前,對外界的訪問進行改寫。

var proxy = new Proxy(target, handler)

ES6 中的proxy目前提供了13種可代理操作攔截的行為。

何為reflect

ES6 標準中,將許多原本屬于?Object?對象的方法轉移到了?Reflect?對象上
把所有對對象的操作轉義到Reflect上。可以將 Reflect 視為一種封裝了底層操作的 API。

Reflect.get(target, propertyKey[, receiver])
//同等于
target[name]Reflect.deleteProperty(target, propertyKey)
//同等于
delete target[name]

在一些舊方法執行錯誤時,只能通過try…catch去拿到,而reflect執行錯誤會返回false

try {Object.defineProperty(target, property, attributes);
} catch(e) {// 失敗
}// 新寫法
if (Reflect.defineProperty(target, property, attributes)) {// success
} else {// failure
}

Reflect 的作用是提供了一種統一且易于理解的方式來執行底層操作,而不是直接操作對象。這樣可以保持代碼的一致性和可讀性,并且避免了直接操作底層方法可能引發的一些問題。

Reflect的好處

統一性:Reflect 提供了一組方法,與底層操作一一對應,使得代碼更加統一和易于理解。
可讀性:使用 Reflect 的方法可以使代碼更加清晰,減少了直接操作底層方法可能引發的一些問題,并且可以直接看到操作的意圖。
安全性:使用 Reflect 的方法可以避免一些潛在的問題,如在嚴格模式下直接使用 delete 可能會拋出錯誤,而 Reflect.deleteProperty 則會返回一個布爾值表示是否刪除成功。

二者結合的好處

Proxy 的攔截器方法中可以調用 Reflect 的對應方法來實現默認行為或者在默認行為的基礎上進行修改。例如,在 Proxy 的 get 攔截器中,可以使用 Reflect.get 方法來獲取原始對象的屬性值,并對其進行修改或返回。

let handler = {get: function(target, key, receiver) {return 1},set: function (target, key, value, receiver) {console.log(`setting ${key}!`);return Reflect.set(target, key, value, receiver);}
}
var obj = new Proxy({}, handler)
obj.a = 5 // setting 5!
console.log(obj.a) // 1

總結

Proxy 和 Reflect 是相輔相成的,通過結合使用它們可以實現更靈活和強大的代理功能,并且使用 Reflect 可以更好地管理和執行底層操作。

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

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

相關文章

遠程工作:自由職業者如何成功賺錢

前言 在這個不斷進步的數字化時代,遠程工作已經從一個可選的邊緣工作方式,成長為主流職業趨勢的一部分。特別是自從全球疫情改變了我們的生活和工作方式以來,遠程工作的概念不再是遙不可及的理想,而是已經成為許多人日常工作的現…

SpringBoot集成swagger2配置權限認證參數

作者簡介:大家好,我是擼代碼的羊駝,前阿里巴巴架構師,現某互聯網公司CTO 聯系v:sulny_ann(17362204968),加我進群,大家一起學習,一起進步,一起對抗…

[Java][JDK5]可變參數

我們可以假設一種情況,我們需要進行求和計算 在原先,我們考慮到參數只能傳入一個數字,因此我們會將需要求和的數字放在一個數組,傳入該數組進入方法再拆分計算 比如下面的例子:使用了增強for來對數組進行遍歷 public class Mai…

【Lidar】基于Python的三維點云數據轉二維平面+散點圖繪制

最近一直在搞點云相關的操作,有時候在處理點云數據時需要查看處理后的數據是否滿足需求,所以就想著寫一套展示點云的代碼。之前已經分享過如何可視化點云了,感興趣的可以自己去看下:【Lidar】基于Python的Open3D庫可視化點云數據。…

golang https server如何設計方便抓包定位且安全

代碼 測試 用go寫后端https服務時,需要定位https包中的內容是否符合預期。 有涉獵的朋友應該了解過https有一種keylog技術,它允許在HTTPS連接中捕獲和記錄SSL或TLS會話密鑰,以便于調試和分析加密流量。 本文將的就是通過可控制開啟和關閉的…

單身狗(Python)

題目描述 單身狗 “單身狗”是中文對于單身人士的一種愛稱。本題請你從上萬人的大型派對中找出落單的客人,以便給予特殊關愛。 輸入格式: 輸入第一行給出一個正整數 N(≤50000),是已知夫妻/伴侶的對數;…

CPU 混合推理,非常見大模型量化方案:“二三五六” 位量化

本篇文章聊聊網上聊的比較少的具體量化操作,非常見整型位數的量化,來自讓各種開源模型能夠在 CPU 環境、CPU & GPU 環境混合推理的技術方案:llama.cpp 。 寫在前面 接下來,有計劃分享一些關于各種開源模型的實踐內容。為了能…

安裝ThingBox Eclipse Plugin

1. ChatGPT問 The latest version of the ThingBox Eclipse Plugin requires Eclipse IDE 2021-06 or later. 2. PTC官網下載 MED-61378-CD-092_F000_Eclipse-Plugin-9-0-1.zip文件, 和 MED-61098-CD-085_F000_ThingWorx-Extension-SDK-8-5-0(需要賬號&#xff09…

虛擬化邏輯架構:KVM虛擬機通過OVS端口組實現網絡連接

目錄 一、實驗 1.CentOS 7 安裝 OpenVSwitch(構建RPM安裝包) 2.KVM虛擬機通過OVS端口組實現網絡連接 二、問題 1.安裝openvswitch-2.5.10報錯 2.virt-install未找到命令 3.如何刪除自定義網絡 一、實驗 1.CentOS 7 安裝 OpenVSwitch(構建RPM安裝包&#xff…

字符串知識點

一. 1.字符占據一個字節 2.字符數組:char name[15] { W, a, n, g, L, i}; 字符串:char name[15] “Wang Li”; 二. 1.字符串:為有效長度(有效字符的個數)而不是字符數組的長度; 2.&#…

創建一個有陰影的threejs三維幾何體

import * as THREE from "three" import { OrbitControls } from three/examples/jsm/controls/OrbitControlsconst width window.innerWidth; const height window.innerHeight;//創建場景 const scene new THREE.Scene(); scene.background new THREE.Color(#6…

LinuxBasicsForHackers筆記 --Python 腳本基礎

添加Python模塊 Python 有一個專門用于安裝和管理 Python 包的包管理器,稱為 pip(Pip Installs Packages)。由于我們在這里使用 Python 3,因此您將需要 Python 3 的 pip 來下載和安裝軟件包。默認情況下應包含 Pip,但…

學習Node.js與Webpack總結

今天學習了模塊化的簡介,其實一個項目是由很多個模塊文件組成的,它們有它們各自的功能和用途來協助這個項目的完成,這樣的模塊組成有很多的好處比如提高代碼的復用性、還可以按需加載、還有獨立的作用域,還需要搞清楚的一點就是No…

如何截取Hive數組中的前N個元素?

文章目錄 1、需求描述2、使用索引3、使用posexplode()4、轉換為字符串操作 1、需求描述 需求:截取任意給定數組中的前N個元素,返回截取后的子數組 假設我們有如下三種類型的Hive數組: select array(1,2,3,4) -- [1,2,3,4] selec…

vue前端訪問Django channels WebSocket失敗

現象 前端報錯:SSH.vue:51 WebSocket connection to ‘ws://127.0.0.1:8000/server/terminal/120.59.88.26/22/1/’ failed: 后端報錯:Not Found: /server/terminal/120.79.83.26/22/1/ 原因 django的版本與channels的版本不匹配(django…

關于個人職業選擇

職業選擇,一直是個老生常談的話題。這并不是一個容易做的決定。 讓我們來看看AI怎么說。 首先是方向性的回答: 然后是一些具體的回答 我個人比較傾向于深耕網絡安全。這是一個很有趣也是一個持續發展著的領域。 不知道關于這個事情你怎么看&#xff0…

在線學習平臺-課程分頁、用戶管理、教師查詢

在線學習平臺------手把手教程👈 用戶管理 添加功能增強 新增屬性 若依里的用戶模塊(SysUser)是沒有課程這一屬性的,要實現我們自己的課程分頁查詢功能 這個位置傳入的實體類SysUser要加上classId,記得加上get、set方法 更改sql語句 ctrl 鼠標左鍵不斷點進去…

DS二叉排序樹之刪除

Description 給出一個數據序列,建立二叉排序樹,并實現刪除功能 對二叉排序樹進行中序遍歷,可以得到有序的數據序列 Input 第一行輸入t,表示有t個數據序列 第二行輸入n,表示首個序列包含n個數據 第三行輸入n個數據…

藍橋杯周賽 第 1 場 強者挑戰賽 6. 小球碰撞【算法賽】(思維題/最長上升子序列LIS)

題目 https://www.lanqiao.cn/problems/9494/learning/?contest_id153 思路來源 Aging代碼 題解 二分時間t&#xff0c;第i個小球對應一個起點pi、終點pit*vi的區間&#xff0c;問題轉化為&#xff0c; 選最多的區間&#xff0c;使得不存在區間包含&#xff08;即li<l…

微信小程序過濾器之計算當前時間差

微信小程序過濾器之計算當前時間差 前言一、wxs簡介二、使用步驟1.定義2.使用 前言 最近遇到了一個需求&#xff0c;將小程序里面的具體時間2023-12-11 09:41:06轉為當前時間差10小時前&#xff0c;這塊可以使用js邏輯函數對數據進行處理&#xff0c;但這里我們采用微信小程序…