21天完美搞定Vue框架技術(第3天)

2021-10-03 05:10:26 字數 2579 閱讀 9530

前言:

上一節我們主要學的是【選項合併】,了解了初始化階段各個選項的合併策略,

本節課我們來學一下【資料**】這個知識點。

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件事情,有些是之前遺留的,有些是突然想到的,每一件事情要做好都有...