ES6 Proxy的學習與理解

2021-09-12 17:54:26 字數 1118 閱讀 5492

前一段時間在位元組跳動時聊到了proxy。起因是問道vue中資料繫結的實現,回答通過設定setter和getter實現,問這樣有什麼缺點,答在對物件的屬性的監控方面存在瑕疵,例如通過直接設定陣列下標進行賦值,或者對物件直接進行修改,是無法觀察到的,必須使用vue.set新增,或者使用array.prototype.push等方法。

面試官介紹說在vue3中已經通過proxy解決了這個問題。proxy是es6中新增的內建物件,和reflect配合功能十分強大。正好今天看到乙個問題。

根據mdn的文件,proxy是對原物件的包裝。可以包裝的內容包括一系列get、set等,值得注意的是getprototypeof同樣是一種可以攔截的操作。同時,對於未定義的操作保持原結果。

在instanceof的頁面,可以看到如下示例

function c() {}

function d() {}

var o = new c();

// true, because: object.getprototypeof(o) === c.prototype

o instanceof c;

那麼,在上面那個問題中,既然未定義proxy的getprototypeof,那它就該與原物件保持一致。使用以下**進行驗證:

object.getprototypeof(proxy) === array.prototype //true
那麼,是不是對於一切行為,在不做任何攔截的情況下,就能保證與目標物件的行為完全一致呢?很顯然,這是不可能的。例如

a = {}

b = new proxy(a, {})

console.log(a === b) //false

以及this的指向問題(案例來自阮一峰文章)

const target = 

};const handler = {};

const proxy = new proxy(target, handler);

target.m() // false

proxy.m() // true

雖然大部分情況下這應該不會成為大的障礙,但遇到錯誤的時候可以從這裡入手尋找問題。

es6 Proxy 學習筆記

proxy 可以理解成,在目標物件之前架設一層 攔截 外界對物件的訪問都必須先通過這層攔截,通過這種 操作的機制,可以對外界的訪問進行過濾和修改。let person let obj new proxy person,obj.name lilei obj.age 暫無該值 proxy例項通過prox...

es6 proxy的簡單使用

proxy,顧名思義是 的意思 也就是對乙個操作的 比如當我們對乙個物件要進行操作的時候,我們是這樣寫的 展示出來的效果是這樣的 瀏覽器有點問題,所以在node的環境下執行 在使用了proxy後,我們的會變成這樣 結果如下 流程的大概是這樣,1.當我們用了上面的寫法後 不要問為什麼這麼寫,遵守是唯一...

ES6 Proxy的基本使用

目標物件 let p 建立 物件 let proxy new proxy p,攔截物件屬性的賦值操作 set target,key,value 屬性無效 target key value return true 攔截判斷物件是否具有某個屬性 in has target,key return key ...