理解Proxy與Reflect
vue3的回應式離不開Proxy
,說到Proxy
則離不開Reflect
.這兩個物件是ES6新增的對象,同時在程式設計領域,他們也代表著2種設計模式,即代理與反射。
Proxy
Proxy
可以理解成,在目標物件之前架設一層“攔截”,外界對該物件的訪問,都必須經過這層攔截,而我們就可以透過這層攔截去改變目標物件的內容或行為,或是叫過濾和控制。這個字本來就是代理,好比一個代理人站在神奇,我們所有行為都會被他過濾,可能我們說的話,經過代理人一說,意思就變了。
ES6 原生提供 Proxy 建構函數,用來產生 Proxy 實例。
var proxy = new Proxy(target, handler);
其中target
表示要代理的那個對象,handler
則是表示我們需要攔截的行為,這裡直接放一張阮一峰的截圖。
Reflect
Reflect
中文翻譯為:反射。如果說Proxy
是有一個代理人站在身前面,幫你攔截並處理一些行為,那麼Reflect
就是你身後的一面鏡子,它能看見真實的自己。
而你自己,就是一個類別或對象,或是一個函數,只要是js中存在的,都能被Proxy
和 Reflect
處理。
它的運算和Proxy
剛好相反,但卻一一對應。例如我們取得物件中一個屬性。
const obj = {foo:1} const a = Reflect.get(obj, 'foo')
這一小節主要是介紹了Proxy與Reflect,後面會有一個應用老告訴你為什麼Proxy與Reflect與響應式資料息息相關。
實作範例
看完了Proxy
與Reflect
的基本使用之後,我們實作一下。
我們曾經寫過這樣的程式碼
const reactive = (object)=>{ return new Proxy(object,{ get(target,key){ track(target,key) return target[key] } set(target,key, newVal){ target[key] = newVal trigger(target,key) return true } }) }
其實就是用Proxy
代理程式了物件讀和取操作,在讀的時候收集依賴,在取的時候觸發回應。看起來似乎沒有問題,那麼我們再試繼續往下寫
const obj = { a:1, get b(){ return this.a } } const data = reactive(obj) effect(()=>{ console.log(data.b) }) setTimeOut(()=>{ data.b++ },500)
這裡我們沒有用一般的物件寫法,而是透過存取器為它新增了一個b屬性.之後,我們先把這個對象轉換為響應式對象,再給他們設定一個響應式的回調,然後在冬天改變他的值,理論上這時候應該會執行副作用函數,但是實際上呢,根本不會執行。
我們回顧一下之前寫的reactive
方法,在裡面回傳的是target[key]
,當我們的target是obj,key是b的時候,那個this會是誰呢?因為target是原始對象,也就是obj,根據誰調用是誰的原則,這個this也就指向了obj。 obj是響應式物件嗎,顯然不是,那個b也就永遠不會執行副作用函數,響應式就失效了。
這裡其實就是this的指向問題,你可能會說一般人怎麼會用getter去賦值屬性呢,但是這個作為一個簡單的case,甚至都算不上邊界,我們需要解決它。
解決的方法也很簡單,就是透過Reflect
。這也是為什麼我說Proxy
與Reflect
就是焦不離孟孟不離焦. 我們的reactive,get的時候,加入第三個參數receiver
get(target,key){ track(target,key,receiver) return Reflect.get(target,key,receiver) }
我在這裡理解的是,receiver
就相當於函數的bind
方法,它改變的this的執行,當我們同過Reflect
#讀取值的時候,this的指向被改為receiver
,而Reflect
時的receiver
又是Proxy
中的入參,它執行了這個Proxy
,從而把前文中this的指向由obj改為data,這樣響應式就不會丟失了。
以上是vue3響應式Proxy與Reflect如何使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Vue.js和React在可擴展性和可維護性上的表現各有優勢。 1)Vue.js易於上手,適合小型項目,CompositionAPI提升了大型項目可維護性。 2)React適用於大型複雜項目,Hooks和虛擬DOM提高了性能和可維護性,但學習曲線較陡峭。

Vue.js和React的未來趨勢和預測分別是:1)Vue.js將在企業級應用中廣泛應用,並在服務端渲染和靜態站點生成方面有突破;2)React將在服務器組件和數據獲取方面創新,並進一步優化並發模式。

Netflix的前端技術棧主要基於React和Redux。 1.React用於構建高性能的單頁面應用,通過組件化開發提升代碼重用性和維護性。 2.Redux用於狀態管理,確保狀態變化可預測和可追踪。 3.工具鏈包括Webpack、Babel、Jest和Enzyme,確保代碼質量和性能。 4.性能優化通過代碼分割、懶加載和服務端渲染實現,提升用戶體驗。

Vue.js是一種漸進式框架,適用於構建交互性強的用戶界面。其核心功能包括響應式系統、組件化開發和路由管理。 1)響應式系統通過Object.defineProperty或Proxy實現數據監聽,自動更新界面。 2)組件化開發允許將界面拆分為可複用的模塊。 3)VueRouter支持單頁面應用,提升用戶體驗。

Vue.js的主要缺點包括:1.生態系統相對較新,第三方庫和工具不如其他框架豐富;2.學習曲線在復雜功能上變得陡峭;3.社區支持與資源不如React和Angular廣泛;4.大型應用中可能遇到性能問題;5.版本升級與兼容性挑戰較大。

Netflix使用React作為其前端框架。 1.React的組件化開發和虛擬DOM機制提高了性能和開發效率。 2.使用Webpack和Babel優化代碼構建和部署。 3.採用代碼分割、服務端渲染和緩存策略進行性能優化。

Vue.js受歡迎的原因包括簡單易學、靈活性高和高效性能。 1)其漸進式框架設計適合初學者逐步學習。 2)組件化開發提高了代碼可維護性和團隊協作效率。 3)響應式系統和虛擬DOM提升了渲染性能。

Vue.js更易用且學習曲線較平緩,適合初學者;React學習曲線較陡峭,但靈活性強,適合有經驗的開發者。 1.Vue.js通過簡單的數據綁定和漸進式設計易於上手。 2.React需要理解虛擬DOM和JSX,但提供更高的靈活性和性能優勢。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。