前言:
上一節我們主要學的是【選項合併】,了解了初始化階段各個選項的合併策略,
本節課我們來學一下【資料**】這個知識點。
1、資料**的定義
資料**,也叫作資料劫持。有兩個核心作用:
(1)在訪問物件的屬性時,可以進行其他的操作
(2)在修改物件的屬性時,可以修改返回的結果
說白了,就是會自動觸發一些函式(方法),在該函式(方法)中處理我們業務邏輯上的需求。
2、資料**的種類
在乙個物件上定義乙個新屬性,或修改現有屬性,並返回這個物件。
這個方法有三個引數,分別是:
第乙個是原物件,即要操作的物件
第二個是該物件的某個屬性,即要操作的屬性
第三個也是物件,那些會自動觸發的方法就在這裡面
看乙個例子:
var obj =
;object.
defineproperty
(obj,
'name',,
set(v)})
obj.name;
// 訪問obj物件的name屬性,自動呼叫get(),輸出:訪問obj時會自動呼叫、2
obj.name =
'年年'
;// 修改obj物件的name屬性,自動呼叫set(),輸出:修改obj屬性時會自動呼叫,而且進行了其他操作,把age變為5
obj.name;
// 再次訪問obj物件的name屬性,自動呼叫get(),輸出:訪問obj時會自動呼叫、5
但是這個資料**的方法是有侷限的,處理一層物件時沒有問題,處理多層級巢狀物件及陣列有一些問題,
我們那處理陣列來看一下,第乙個引數就是陣列本身,第二個引數為陣列的下標,第三個引數還是一樣的,就是包含set()、get()方法的物件。
還是看**:
var arr =
['年年'
,'有魚'
,'卡卡'];
for(i in arr)
,set()
});}
arr[1]
='樓樓'
;// 修改時,可以呼叫set(),輸出:修改arr時會自動呼叫
console.
log(arr)
;// 訪問時,可以呼叫get(),輸出:訪問arr時會自動呼叫
這種情況是對原有陣列修改,結果是沒有問題的,但如果像 arr[3] = 『樓樓』 這樣新增陣列時,就不可以了。
所以說為了解決這種情況,就需要使用下面的資料**方法。
(2) proxy()
這個資料**方法其實也比較好理解,就是參照原物件建立乙個新的**物件,我們的操作都是在這個新物件上完成的。
它有兩個引數,第乙個是原來物件,第二個是含有get()、set()的物件
它的返回值就是新建立的**物件。
而且不僅僅可以處理物件,還可以處理陣列及多層級物件巢狀。
看乙個例子:
var arr =
['年年'
,'有魚'
,'卡卡'];
let obj =
newproxy
(arr,
,set
:function
(target, key, receiver)})
obj[2]
='樓樓'
;// 修改原有資料,呼叫set(),結果:修改時會自動呼叫
console.
log(obj[2]
);// 訪問資料,呼叫get(),結果:獲取時會自動呼叫2
obj[5]
='西瓜'
// 新增新資料,呼叫set(),結果:修改時會自動呼叫
3、資料**的應用場景場景1:vue當中的資料響應系統使用的是 object.defineproperty()
這個應用場景後期會單獨分析,今天暫不多說。
場景2:vue渲染模板時使用的是基於proxy()新封裝的方法 initproxy()
initproxy()本質上就是對vue例項化物件做了一層**,用於一些資料篩選及非法攔截。
例如過濾$,_開頭的vue內部變數、js的關鍵字、模板使用未定義的變數等。
4、兩種資料**的利弊
object.defineproperty和proxy都可以實現資料**,
前者相容性較好,但是卻無法對陣列或者巢狀的物件進行**監測,
後者基本可以解決所有的問題,但是對相容性要求很高。
後記:
贈人玫瑰,手有餘香!如果覺得文章對您有幫助,
請給乙個大大的贊,還可以分享讓更的人知道哦!
您也是web前端學習者,可以加vx:qingyulan52
最後祝您學習進步,早日成為技術大拿!!!
60天完美口才打造計畫
楊海洋 編著 豆瓣鏈結 2020 年 3 月 14日 更新 絕大多數書籍都只告訴讀者好口才的標準是什麼,卻沒有訓練方法。例如,講話要幽默 要有條理 要懂得控制 要有信心 要富有邏輯。但卻不告訴讀者,應該怎樣訓練才能夠練出這樣的好口才。好口才是可以練出來的 絕大多數演講的技能都是後天養成的,只是那些演...
第二天完善登入
今天把登入功能完善了,老師在課堂上講了很多,但是有時候聽起來就是蒙,沒辦法只能下去自己學了,實在是不懂了再問吧!畢竟現在是練習自己的自主能力的,不能什麼都依靠別人,對吧。using system using system.collections.generic using system.compon...
一天完成15件複雜的事情
這是學習筆記的第 1726 篇文章 假設你有200臺伺服器的訪問和管理許可權,那麼對你來說,有哪些事情是需要馬上完成的。其實如果讓我們想象,那麼應該是有太多的事情,那麼伺服器規模和基數的乘積就是做這件事情的複雜度。為此,我想了如下的15件事情,有些是之前遺留的,有些是突然想到的,每一件事情要做好都有...