摘要:數(shù)據(jù)劫持?jǐn)?shù)據(jù)劫持即使用實(shí)現(xiàn)了的雙向綁定。不輸出內(nèi)容數(shù)據(jù)代理即代理的意思。的攔截處理器除了外還支持多種攔截方式,具體請查閱官方文檔嵌套查詢。實(shí)際上也是不支持嵌套查詢的。
數(shù)據(jù)劫持
數(shù)據(jù)劫持即使用Object.defineProperty()實(shí)現(xiàn)了vue的雙向綁定。先來看看它是如何實(shí)現(xiàn)的
let obj = {}, txt = "" Object.defineProperty(obj,"txt",{ set(val) { console.log("set ....") txt = val || ""; }, get() { //獲取obj.txt時會觸發(fā)get的回調(diào)。 console.log("get ....") return txt } })
Object.defineProperty的缺點(diǎn)
1、無法監(jiān)聽到數(shù)組的變化
舉個例子
//當(dāng)被監(jiān)聽的屬性是數(shù)組時 let arr = [1,2,3] let obj = {} Object.defineProperty(obj,"arr",{ set(val) { console.log("set",val) arr = val }, get() { console.log("get") return arr } }) obj.arr.push(4) // get 實(shí)際上是改變arr的值但是卻沒有執(zhí)行set而是執(zhí)行了get obj.arr = [1,2,3,4] // 執(zhí)行了set
當(dāng)被監(jiān)聽的屬性是數(shù)組,這幾個方法push、pop、shift、unshift、splice、sort、reverse不會觸發(fā)set。vue將這幾個修改原始的數(shù)組的方法稱為變異方法
2、必須遍歷對象的每一個屬性
Object.keys(obj).forEach(key=>{ Object.defineProperty(obj,key,{ //.... }) })
3、必須深層遍歷嵌套對象
let person = { name:{ firstName:"chan", lastName:"louis" } }當(dāng)遇到變異方法時舊版本的vue通過重寫方法來進(jìn)行數(shù)據(jù)劫持
const aryMethods = ["push", "pop", "shift", "unshift", "splice", "sort", "reverse"]; const arrayAugmentations = []; aryMethods.forEach((method)=> { // 這里是原生 Array 的原型方法 let original = Array.prototype[method]; // 將 push, pop 等封裝好的方法定義在對象 arrayAugmentations 的屬性上 // 注意:是實(shí)例屬性而非原型屬性 arrayAugmentations[method] = function () { console.log("has change"); // 調(diào)用對應(yīng)的原生方法并返回結(jié)果 return original.apply(this, arguments); }; }); let list = ["a", "b", "c"]; // 將我們要監(jiān)聽的數(shù)組的原型指針指向上面定義的空數(shù)組對象 // 這樣就能在調(diào)用 push, pop 這些方法時走進(jìn)我們剛定義的方法,多了一句 console.log list.__proto__ = arrayAugmentations; list.push("d"); // 我被改變啦! // 這個 list2 是個普通的數(shù)組,所以調(diào)用 push 不會走到我們的方法里面。 let list2 = ["a", "b", "c"]; list2.push("d"); // 不輸出內(nèi)容Proxy數(shù)據(jù)代理
proxy即代理的意思。個人理解,建立一個proxy代理對象(Proxy的實(shí)例),接受你要監(jiān)聽的對象和監(jiān)聽它的handle兩個參數(shù)。當(dāng)你要監(jiān)聽的對象發(fā)生任何改變,都會被proxy代理攔截來滿足需求。
var arr = [1,2,3] var handle = { //target目標(biāo)對象 key屬性名 receiver實(shí)際接受的對象 get(target,key,receiver) { console.log(`get ${key}`) // Reflect相當(dāng)于映射到目標(biāo)對象上 return Reflect.get(target,key,receiver) }, set(target,key,value,receiver) { console.log(`set ${key}`) return Reflect.set(target,key,value,receiver) } } //arr要攔截的對象,handle定義攔截行為 var proxy = new Proxy(arr,handle) proxy.push(4) //可以翻到控制臺測試一下會打印出什么
1、使用proxy可以解決defineProperty不能監(jiān)聽數(shù)組的問題,避免重寫數(shù)組方法;
2、不需要再遍歷key。
3、Proxy handle的攔截處理器除了get、set外還支持多種攔截方式,具體請查閱官方文檔(https://developer.mozilla.org...)
4、嵌套查詢。實(shí)際上proxy get()也是不支持嵌套查詢的。解決方法:
let handler = { get (target, key, receiver) { // 遞歸創(chuàng)建并返回 if (typeof target[key] === "object" && target[key] !== null) { return new Proxy(target[key], handler) } return Reflect.get(target, key, receiver) } }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/105370.html
摘要:我們先以框架出發(fā),探索其中數(shù)據(jù)劫持的奧秘。針對對象在數(shù)據(jù)劫持這個問題上,可以被認(rèn)為是的升級版。技術(shù)支持監(jiān)測數(shù)組的等方法操作,支持對象屬性的動態(tài)添加和刪除,極大的簡化了響應(yīng)化的代碼量。 隨著前端界的空前繁榮,各種框架橫空出世,包括各類mvvm框架百家爭鳴,比如Anglar、Vue、React等等,它們最大的優(yōu)點(diǎn)就是可以實(shí)現(xiàn)數(shù)據(jù)綁定,再也不需要手動進(jìn)行DOM操作了,它們實(shí)現(xiàn)的原理也基本上是...
摘要:攔截之前的準(zhǔn)備在應(yīng)用啟動的特定生命周期內(nèi)改寫字節(jié)碼,植入特定的邏輯處理代碼進(jìn)行攔截。劫持通過字節(jié)碼改寫動態(tài)代理等技術(shù),在客戶端調(diào)用代碼中嵌入特定處理邏輯,獲取調(diào)用相關(guān)的信息,如調(diào)用地址調(diào)用協(xié)議調(diào)用結(jié)果等。 這次我們?yōu)榇蠹規(guī)碇虚g件增強(qiáng)框架專題(MOF)的最后一篇文章,為大家講解MOF中的InterceptFramework框架。該框架可以在應(yīng)用啟動過程中獲取畫像信息,實(shí)現(xiàn)應(yīng)用畫像數(shù)據(jù)采...
摘要:只能劫持對象的屬性因此我們需要對每個對象的每個屬性進(jìn)行遍歷。屬性對于怎么拼接到和上面說到了怎么使用做數(shù)據(jù)劫持,怎么結(jié)合訂閱發(fā)布,請結(jié)合數(shù)據(jù)雙向綁定探究對照著數(shù)據(jù)劫持的部分去替換看一下。 前言 2018年11月16日,關(guān)注vue的人都知道這個時間點(diǎn)發(fā)生了什么事兒吧。vue3.0更新內(nèi)容 研究數(shù)據(jù)雙向綁定的大佬們都在開始猜測這個新機(jī)制了,用原生Proxy替換Object.definePro...
摘要:方法實(shí)現(xiàn)將所有屬性掛載在觀察對象,將每一項做一個數(shù)據(jù)劫持就是將中每一項用定義新屬性并返回這個對象。當(dāng)和發(fā)生變化時,自動會觸發(fā)視圖更新,獲取得到的也就是最新值。 MVVM及Vue實(shí)現(xiàn)原理 Github源碼地址:https://github.com/wyj2443573... mvvm 雙向數(shù)據(jù)綁定數(shù)據(jù)影響視圖,視圖影響數(shù)據(jù)angular 臟值檢測 vue數(shù)據(jù)劫持+發(fā)布訂閱模式vue 不...
閱讀 1717·2023-04-26 01:02
閱讀 4881·2021-11-24 09:39
閱讀 1817·2019-08-30 15:44
閱讀 2901·2019-08-30 11:10
閱讀 1795·2019-08-30 10:49
閱讀 993·2019-08-29 17:06
閱讀 619·2019-08-29 16:15
閱讀 910·2019-08-29 15:17