vue處理響應式數據,是Proxy性能好?還是defineProperty性能好?

注:本文主要論證二者性能!!!

????????首先,Proxy和defineProperty是兩種不同的機制,用于實現JavaScript的元編程(metaprogramming)功能。

????????defineProperty是ES5引入的一個特性,用于在一個對象上定義一個新的屬性,或者修改一個已經存在的屬性。它通過修改對象的屬性描述符(property descriptor)來實現對屬性的控制,例如可以定義屬性是否可讀寫、是否可枚舉、是否可配置等。defineProperty的優點是可以精確地控制屬性的行為,但是因為它是基于對象的屬性來實現的,所以對于對象的整體行為是無法控制的。

? ? ? Proxy是ES6引入的一個功能,它可以用來創建一個代理(proxy),用于攔截對一個對象的操作。Proxy可以攔截對象的各種操作,包括獲取屬性、設置屬性、刪除屬性、調用方法等,從而可以實現對對象行為的完全控制。Proxy的優點是非常靈活,可以實現復雜的邏輯控制,而且可以對對象整體進行攔截。

Proxy性能比defineProperty好?不準確!!!

????????根據需求不同,選擇使用defineProperty還是Proxy會有不同的效果。

如果只需要對對象的某個屬性進行控制,可以使用defineProperty來定義屬性的行為;
(vue3對于原始類型定義使用ref,可以論證)

如果需要對整個對象進行控制,或者想要實現更復雜的邏輯控制,可以使用Proxy來創建代理對象。
(vue3對于對象類型定義使用reactive,可以論證)

????????對于性能來說,defineProperty通常會比Proxy更好,因為defineProperty是基于對象的屬性進行操作,開銷相對較小。而Proxy是對整個對象進行攔截,會引入一定的性能開銷。

區別:

  1. defineProperty是在ES5中引入的特性,而Proxy是在ES6中引入的特性。
  2. defineProperty用于在對象上定義或修改屬性的行為,而Proxy用于創建代理對象,可以對整個對象的操作進行攔截和修改。

聯系:

  1. 兩者都可以用于實現元編程功能,即在運行時動態修改對象的行為。
  2. 都可以用于攔截對屬性的讀寫、刪除等操作。
  3. 都可以用于實現數據綁定、代理模式、虛擬化等功能。
    ?

Proxy相比defineProperty的優勢有以下幾點:

  1. 更強大的攔截能力:Proxy可以攔截對象的更多操作,如訪問屬性、刪除屬性、修改屬性等,而defineProperty只能攔截屬性的讀取和寫入操作。

  2. 更直觀的語法:Proxy使用更簡潔的語法來定義攔截行為,可以直接通過Proxy對象來操作原始對象,而defineProperty需要在原始對象上定義攔截器。

  3. 支持對整個對象的攔截:Proxy可以對整個對象進行攔截,而defineProperty只能對對象的指定屬性進行攔截。

  4. 更好的性能表現:由于Proxy是在語言層面實現的攔截,而defineProperty是在底層實現的攔截,所以Proxy的性能通常會比defineProperty更好。

????????Proxy相比defineProperty在攔截能力、語法簡潔性和性能表現等方面具有優勢。但需要注意的是,Proxy是ES6的新特性,可能在一些老版本的瀏覽器中不被支持。

下面是代碼示例:

使用defineProperty實現屬性的控制:

const obj = {};Object.defineProperty(obj, 'name', {value: 'John',writable: false, // 屬性不可寫enumerable: true, // 屬性可枚舉configurable: false // 屬性不可配置
});obj.name = 'Bob';
console.log(obj.name); // 輸出 'John'

使用Proxy創建代理對象:

const obj = {name: 'John'
};const proxy = new Proxy(obj, {get(target, prop) {console.log(`Getting property ${prop}`);return target[prop];},set(target, prop, value) {console.log(`Setting property ${prop} to ${value}`);target[prop] = value;}
});console.log(proxy.name); // 輸出 'Getting property name', 'John'
proxy.name = 'Bob'; // 輸出 'Setting property name to Bob'
console.log(obj.name); // 輸出 'Bob'

????????在上述示例中,defineProperty通過修改屬性的描述符來控制屬性的行為,只能對單個屬性進行操作。而Proxy則創建了一個代理對象,可以對整個對象的操作進行攔截和修改。
?

上代碼

我們可以通過一段代碼來試試,看看?Proxy VS defineProperty,哪個性能更好

// Proxy
const proxy = new Proxy(target, {get: (target, prop, receiver) => {return Reflect.get(target, prop, receiver)},set(target, prop, value) {return Reflect.set(target, prop, value)},
});
// defineProperty
let age = 0;
Object.defineProperty(target, 'age', {get: function () {return age;},set: function (value) {age = value;},
});
console.time('Proxy');for (let i = 0; i < 100000; i++) {proxy.age;proxy.age = i
}
console.timeEnd('Proxy')
console.time('defineProperty')
for (let i = 0; i < 100000; i++) {target.nametarget.name = i
}
console.timeEnd('defineProperty')// Proxy: 29.943115234375 ms
// defineProperty: 2.517822265625 ms

????????總的來說,Proxy相比defineProperty具有更強大的功能和靈活性,但是在性能上會稍微遜色一些。這是因為Proxy的代理操作會引入一定的性能開銷,而defineProperty是直接修改對象的屬性描述符,開銷較小。但是這個性能差距在大多數場景下是可以忽略的,所以在需要實現更復雜的邏輯控制的情況下,推薦使用Proxy。

注:本文主要論證ProxydefineProperty二者性能

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

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

相關文章

HDL FPGA 學習 - FPGA基本要素,開發流程,Verilog語法和規范、編寫技巧

目錄 Altera FPGA 基本要素 FPGA 開發流程和適用范圍 設計和實施規范 頂層設計的要點 Verilog HDL 語法規范 編寫規范 設計技巧 編輯整理 by Staok&#xff0c;始于 2021.2 且無終稿。轉載請注明作者及出處。整理不易&#xff0c;請多支持。 本文件是“瞰百易”計劃的…

SQL注入漏洞解析--less-6

1.第六關了。 2.這個和第五關有點像&#xff0c;只是換成了雙引號&#xff0c;接下來的都一樣&#xff0c;看我操作(換個函數試一下extractvalue&#xff0c;他的報錯位置在第二個&#xff0c;那我就利用一下) 3.爆庫名 ?id1"%20and%20extractvalue(1,concat(0x7e,(sele…

刷題日記 | 字符串擴容和增強型for循環

for(char c:s)遍歷字符串 增強型for循環 C for(char c:s)遍歷字符串 增強型for循環_c for (char c : s)-CSDN博客 字符串使用前要進行擴容 reserve函數 【CString類成員函數辨析】resize(),size(),capacity(),reserve()函數的解析與對比_c reserve函數-CSDN博客 a.size() 用來…

告警閃現后的故障排查

長期以來&#xff0c;醫院信息化運維中存在著科室復雜、應用場景多、終端運維工作量大、軟件系統兼容需求強等諸多痛點&#xff0c;且對技術設備的穩定性、連續性要求極高&#xff0c;在日常運維中&#xff0c;需要應對和解決這些問題來保障業務穩定、健康運行。 1、數據孤島 …

Centos6安裝PyTorch要求的更高版本gcc

文章目錄 CentOS自帶版本安裝gcc 4的版本1. 獲取devtoolset-8的yum源2. 安裝gcc3. 版本檢查和切換版本 常見問題1. 找不到包audit*.rpm包2. 找不到libcgroup-0.40.rc1-27.el6_10.x86_64.rpm 的包4. cc: fatal error: Killed signal terminated program cc1plus5. pybind11/pybi…

安達發|可視化APS高級排產系統實現精益制造

精益制造已經成為了一種重要的生產模式&#xff0c;它的目標是通過消除浪費&#xff0c;提高生產效率&#xff0c;以實現更高的質量和更低的成本。而可視化APS高級排產系統則是實現精益制造的重要工具。下面&#xff0c;我將從接單可視化、BOM工藝可視化、計劃與排程可視化、制…

[Android 13]Input系列--獲取觸摸窗口

[Android 13]Input系列–獲取觸摸窗口 hongxi.zhu 2023-7-25 Android 13 InputDispatcher::dispatchMotionLocked bool InputDispatcher::dispatchMotionLocked(nsecs_t currentTime, std::shared_ptr<MotionEntry> entry,DropReason* dropReason, nsecs_t* nextWakeupT…

【Flink精講】Flink性能調優:CPU核數與并行度

常見問題 舉個例子 提交任務命令&#xff1a; bin/flink run \ -t yarn-per-job \ -d \ -p 5 \ 指定并行度 -Dyarn.application.queuetest \ 指定 yarn 隊列 -Djobmanager.memory.process.size2048mb \ JM2~4G 足夠 -Dtaskmanager.memory.process.size4096mb \ 單個 TM2~8G 足…

Android 性能優化--APK加固(1)混淆

文章目錄 為什么要開啟混淆如何開啟代碼混淆如何開啟資源壓縮代碼混淆配置代碼混淆后&#xff0c;Crash 問題定位結尾 本文首發地址&#xff1a;https://h89.cn/archives/211.html 最新更新地址&#xff1a;https://gitee.com/chenjim/chenjimblog 為什么要開啟混淆 先上一個 …

【會議征稿通知】第十屆人文學科與社會科學研究國際學術會議(ICHSSR 2024)

第十屆人文學科與社會科學研究國際學術會議&#xff08;ICHSSR 2024) 2024 10th International Conference on Humanities and Social Science Research 第十屆人文學科與社會科學研究國際學術會議&#xff08;ICHSSR 2023)將于2024年4月26-28日在中國廈門隆重舉行。會議主要…

工廠生產效率如何提升?這8個重點你不得不看!

企業的競爭本質上就是效率與成本的競爭&#xff08;當然是保證產品質量的前提下&#xff09;&#xff0c;如何持續不斷地提高生產效率是企業永續發展的關鍵問題&#xff0c;提高生產效率也是降低制造成本的根本途徑。 當然&#xff0c;我們必須嚴格根據工藝標準來操作&#xf…

如何通過ip查詢用戶的歸屬地

背景 最近公司做了一些營銷活動&#xff0c;投入資金進行了流量推廣&#xff0c;pv、UV都做了統計。老板說&#xff0c;我要看下用戶的區域分布的數據。 以前的文章我講過&#xff0c;pv、UV如何統計&#xff1f;我們是基于ip進行統計的。用的ip能獲取到&#xff0c;那通過ip…

JavaScript繼承

JavaScript繼承 1、JS 的繼承到底有多少種實現方式呢? 2、ES6 的 extends 關鍵字是用哪種繼承方式實現的呢? 繼承種類 原型鏈繼承 function Parent1() {this.name parentlthis.play [1, 2, 3] }function Child1() {this.type child2 }Child1.prototype new Parent1(…

應用穩定性優化1:ANR問題全面解析

閃退、崩潰、無響應、重啟等是應用穩定性常見的問題現象&#xff0c;穩定性故障大體可歸類為ANR/凍屏、Crash/Tombstone、資源泄露三大類。本文通過對三類故障的產生原因、故障現象、觸發機制及如何定位等&#xff0c;展開深度解讀。 本文將詳解ANR類故障&#xff0c;并通過一…

寶塔php站點設置偽靜態規則 訪問 a.com 時候跳轉到 a.com/b.html

要在寶塔 PHP 站點中設置偽靜態規則&#xff0c;實現訪問a.com時跳轉到a.com/b.html&#xff0c;可以按照以下步驟進行操作&#xff1a; 打開寶塔面板并登錄到你的服務器管理界面。進入網站設置頁面&#xff0c;找到你要設置偽靜態規則的 PHP 站點。在站點設置中&#xff0c;找…

已解決System.ServiceModel.EndpointNotFoundException端點未找到異常的正確解決方法,親測有效!!!

已解決System.ServiceModel.EndpointNotFoundException端點未找到異常的正確解決方法&#xff0c;親測有效&#xff01;&#xff01;&#xff01; 目錄 問題分析 出現問題的場景 報錯原因 解決思路 解決方法 總結 在開發和使用基于Windows Communication Foundation (WC…

【前端素材】推薦優質后臺管理系統cassie平臺模板(附源碼)

一、需求分析 1、系統定義 后臺管理系統是一種用于管理網站、應用程序或系統的管理界面&#xff0c;通常由管理員和工作人員使用。它提供了訪問和控制網站或應用程序后臺功能的工具和界面&#xff0c;使其能夠管理用戶、內容、數據和其他各種功能。 2、功能需求 后臺管理系…

解鎖AI大模型秘籍:未來科技的前沿探索

在當今這個技術高速發展的時代&#xff0c;人工智能&#xff08;AI&#xff09;已經成為了我們生活中不可或缺的一部分。從簡單的個人助手到復雜的數據分析和決策制定&#xff0c;AI的應用范圍日益擴大&#xff0c;其目的是為了讓我們的生活變得更加智能化。本文旨在探討AI如何…

【單片機學習的準備】

文章目錄 前言一、找一個視頻是二、畫圖軟件三、裝keil5 仿真protues總結 前言 提示&#xff1a;這里可以添加本文要記錄的大概內容&#xff1a; 項目需要&#xff1a; 提示&#xff1a;以下是本篇文章正文內容&#xff0c;下面案例可供參考 一、找一個視頻是 https://www.b…