ES6 Proxy和Reflect

Proxy的用法:

用于修改某個(gè)變量的默認(rèn)數(shù)據(jù)操作簇秒,代理新的寫(xiě)法偎行。
語(yǔ)法如下:
const person = {name: 'xiaolu',age: 'secret'}
const handle = {
get: function(target,key,property) {},
set: function(target,key,property) {}
}
let proxyPerson = new Proxy(person,handler); // person是要代理的對(duì)象,handler是代理的對(duì)象的操作方法
熱門(mén)應(yīng)用:
優(yōu)化Vue3的響應(yīng)式
如我們所知,Vue2的響應(yīng)式其實(shí)存在一些缺點(diǎn),比如需要深度監(jiān)聽(tīng)藏姐,一次性遞歸到底,計(jì)算量大该贾,無(wú)法監(jiān)聽(tīng)新增和刪除的屬性羔杨,無(wú)法監(jiān)聽(tīng)數(shù)組的新增和刪除方法,Proxy可以?xún)?yōu)化這些缺點(diǎn)杨蛋,但Proxy也有不足问畅,它的兼容性并不是特別好,需要針對(duì)某些瀏覽器寫(xiě)補(bǔ)丁六荒。目前先學(xué)習(xí)它是如何優(yōu)化Vue2.x的缺點(diǎn)护姆。在學(xué)習(xí)之前需要先引入Reflect這個(gè)概念。

Reflect

Reflect是為操作對(duì)象而設(shè)計(jì)的API掏击,它是為了優(yōu)化Object上面的一些工具函數(shù)卵皂,舉個(gè)例子:
Object.defineProperty(target,key,{
get: {} // 當(dāng)觸發(fā)讀取操作時(shí)回調(diào)
set: {} // 當(dāng)觸發(fā)寫(xiě)的操作時(shí)回調(diào)
})
這個(gè)工具方法給get和set方法賦回調(diào)函數(shù),Reflect方法對(duì)應(yīng)的寫(xiě)法是
Reflect.get(target,key,property)
Reflect.set(target,key,property)
總結(jié)一下砚亭,Reflect就是為了凈化Object,因?yàn)镺bject越來(lái)越笨重灯变。

Vue3實(shí)現(xiàn)響應(yīng)式

1.簡(jiǎn)單的代理,不加任何操作


image.png

image.png

打印可以看到捅膘,修改set沒(méi)有成功添祸,因?yàn)閟et方法已經(jīng)被代理覆蓋了,且并沒(méi)有寫(xiě)賦值操作寻仗,之前的不起作用了刃泌,那么如果想要set生效,需要用Reflect加上如下的代碼:
let result = Reflect.set(target,name,property) ,即調(diào)用底層的set方法耙替。
為什么要用Reflect呢亚侠?我也不知道,官方就是這么推薦的俗扇,Proxy和Reflect算是一對(duì)好兄弟吧硝烂,Proxy能代理的方法,Reflect也都有對(duì)應(yīng)的操作方法铜幽,下面開(kāi)始進(jìn)入正題滞谢。
2.響應(yīng)式寫(xiě)法
Object.defineProperty()這個(gè)方法添加的set屬性有先后順序,就是必須先給屬性加了這個(gè)方法除抛,后續(xù)修改賦值的時(shí)候狮杨,才會(huì)觸發(fā)set方法,所以就會(huì)有新增和刪除無(wú)法響應(yīng)的缺點(diǎn)镶殷。
Proxy優(yōu)化這個(gè)缺點(diǎn)的思路就是禾酱,直接代理了讀和取微酬,我詳細(xì)描述一下:
1.通過(guò)Object.defineProperty(person,name,{
get: {}
set: {}
}) 監(jiān)聽(tīng)name屬性的set

person.name = 'hahaha' 執(zhí)行這段代碼绘趋,person會(huì)先調(diào)用person內(nèi)置的set方法,然后再執(zhí)行上面的set方法颗管,那么新增一個(gè)city屬性呢陷遮,
person.city = '深圳'
很顯然無(wú)法監(jiān)聽(tīng)到,因?yàn)樯厦娌](méi)有針對(duì)city綁定set和get方法
2.通過(guò)Proxy監(jiān)聽(tīng)
proxyPerson.name = 'hahaha' 執(zhí)行這段代碼垦江,person會(huì)試圖調(diào)用person內(nèi)置的set方法帽馋,然而因?yàn)閜roxyPerson這個(gè)實(shí)例已經(jīng)全權(quán)代理了person的get和set,所以?xún)?nèi)置的原始的get和set方法不生效了比吭,反而是直接執(zhí)行proxyPerson代理的set方法绽族,所以必須要調(diào)用Reflect.set去修改屬性,很搞笑吧衩藤,因?yàn)榈讓痈傻幕頿roxyPerson全部接過(guò)來(lái)了吧慢,這樣實(shí)現(xiàn)響應(yīng)式是不是就解決了無(wú)法監(jiān)聽(tīng)新增和刪除屬性了呢?實(shí)現(xiàn)監(jiān)聽(tīng)對(duì)象新增刪除的代碼:

image.png

3.深度監(jiān)聽(tīng)
還需要加入深度監(jiān)聽(tīng)的邏輯赏表,等等检诗,不是直接代理對(duì)象就完了嗎?然而并不是瓢剿,proxy代理的只是對(duì)象的第一層屬性逢慌,深度層級(jí)的屬性需要另外代理,代碼如下:
添加紅色框內(nèi)的代碼
image.png

控制臺(tái)查看發(fā)現(xiàn)city屬性也變成了proxy實(shí)例

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末间狂,一起剝皮案震驚了整個(gè)濱河市攻泼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖坠韩,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件距潘,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡只搁,警方通過(guò)查閱死者的電腦和手機(jī)音比,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)氢惋,“玉大人洞翩,你說(shuō)我怎么就攤上這事⊙嫱” “怎么了骚亿?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)熊赖。 經(jīng)常有香客問(wèn)我来屠,道長(zhǎng)瘸味,這世上最難降的妖魔是什么馍驯? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮妆够,結(jié)果婚禮上传趾,老公的妹妹穿的比我還像新娘迎膜。我一直安慰自己,他們只是感情好浆兰,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布磕仅。 她就那樣靜靜地躺著,像睡著了一般簸呈。 火紅的嫁衣襯著肌膚如雪榕订。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,146評(píng)論 1 297
  • 那天蜕便,我揣著相機(jī)與錄音劫恒,去河邊找鬼。 笑死玩裙,一個(gè)胖子當(dāng)著我的面吹牛兼贸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吃溅,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼溶诞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了决侈?” 一聲冷哼從身側(cè)響起螺垢,我...
    開(kāi)封第一講書(shū)人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤喧务,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后枉圃,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體功茴,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年孽亲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了坎穿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡返劲,死狀恐怖玲昧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情篮绿,我是刑警寧澤孵延,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站亲配,受9級(jí)特大地震影響尘应,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吼虎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一犬钢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鲸睛,春花似錦娜饵、人聲如沸坡贺。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)遍坟。三九已至拳亿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間愿伴,已是汗流浹背肺魁。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留隔节,地道東北人鹅经。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像怎诫,于是被迫代替她去往敵國(guó)和親瘾晃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353