摘要:為了保證的可讀性,本文采用意譯而非直譯。對象的所有用法,都是上面的這種形式。其中用來生成實例,是表示所要攔截的對象,是用來定制攔截行為的對象。雖然不同的創建模式支持類似的功能,但無法用隱式初始值包裝對象。
為了保證的可讀性,本文采用意譯而非直譯。
想閱讀更多優質文章請猛戳GitHub博客,一年百來篇優質文章等著你!
Proxy 介紹使用Proxy,你可以將一只貓偽裝成一只老虎。下面大約有6個例子,我希望它們能讓你相信,Proxy 提供了強大的 Javascript 元編程。
盡管它不像其他ES6功能用的普遍,但Proxy有許多用途,包括運算符重載,對象模擬,簡潔而靈活的API創建,對象變化事件,甚至Vue 3背后的內部響應系統提供動力。
Proxy用于修改某些操作的默認行為,也可以理解為在目標對象之前架設一層攔截,外部所有的訪問都必須先通過這層攔截,因此提供了一種機制,可以對外部的訪問進行過濾和修改。這個詞的原理為代理,在這里可以表示由它來“代理”某些操作,譯為“代理器”。
ES6原生提供了Proxy構造函數,用來生成Proxy實例。
var proxy = new Proxy(target, handler);
Proxy對象的所有用法,都是上面的這種形式。不同的只是handle參數的寫法。其中new Proxy用來生成Proxy實例,target是表示所要攔截的對象,handle是用來定制攔截行為的對象。
下面是 Proxy 最簡單的例子是,這是一個有陷阱的代理,一個get陷阱,總是返回42。
let target = { x: 10, y: 20 } let hanler = { get: (obj, prop) => 42 } target = new Proxy(target, hanler) target.x //42 target.y //42 target.x // 42
結果是一個對象將為任何屬性訪問操作都返回“42”。 這包括target.x,target["x"],Reflect.get(target, "x")等。
但是,Proxy 陷阱當然不限于屬性的讀取。 它只是十幾個不同陷阱中的一個:
handler.get
handler.set
handler.has
handler.apply
handler.construct
handler.ownKeys
handler.deleteProperty
handler.defineProperty
handler.isExtensible
handler.preventExtensions
handler.getPrototypeOf
handler.setPrototypeOf
handler.getOwnPropertyDescriptor
Proxy 用例 默認值/“零值”在 Go 語言中,有零值的概念,零值是特定于類型的隱式默認結構值。其思想是提供類型安全的默認基元值,或者用gopher的話說,給結構一個有用的零值。
雖然不同的創建模式支持類似的功能,但Javascript無法用隱式初始值包裝對象。Javascript中未設置屬性的默認值是undefined。但 Proxy 可以改變這種情況。
const withZeroValue = (target, zeroValue) => new Proxy(target, { get: (obj, prop) => (prop in obj) ? obj[prop] : zeroValue })
函數withZeroValue 用來包裝目標對象。 如果設置了屬性,則返回屬性值。 否則,它返回一個默認的“零值”。
從技術上講,這種方法也不是隱含的,但如果我們擴展withZeroValue,以Boolean (false), Number (0), String (""), Object ({}),Array ([])等對應的零值,則可能是隱含的。
let pos = { x: 4, y: 19 } console.log(pos.x, pos.y, pos.z) // 4, 19, undefined pos = withZeroValue(pos, 0) console.log(pos.z, pos.y, pos.z) // 4, 19, 0
此功能可能有用的一個地方是坐標系。 繪圖庫可以基于數據的形狀自動支持2D和3D渲染。 不是創建兩個多帶帶的模型,而是始終將z默認為 0 而不是undefined,這可能是有意義的。
負索引數組在JS中獲取數組中的最后一個元素方式通過寫的很冗長且重復,也容易出錯。 這就是為什么有一個TC39提案定義了一個便利屬性Array.lastItem來獲取和設置最后一個元素。
其他語言,如Python和Ruby,使用負組索引更容易訪問最后面的元素。例如,可以簡單地使用arr[-1]替代arr[arr.length-1]訪問最后一個元素。
使用 Proxy 也可以在 Javascript 中使用負索引。
const negativeArray = (els) => new Proxy(els, { get: (target, propKey, receiver) => Reflect.get(target, (+propKey < 0) ? String(target.length + +propKey) : propKey, receiver) });
一個重要的注意事項是包含handler.get的陷阱字符串化所有屬性。 對于數組訪問,我們需要將屬性名稱強制轉換為Numbers,這樣就可以使用一元加運算符簡潔地完成。
現在[-1]訪問最后一個元素,[-2]訪問倒數第二個元素,以此類推。
const unicorn = negativeArray(["
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/105712.html
摘要:并且,一些偽元素可以使開發者獲取到不存在于源文檔中的內容比如常見的還可以為偽元素定制樣式。。中新增加的偽元素必須用偽類使用一個冒號例如。就本文而言,我們將把我們探討的范圍限制在和這兩個偽元素的巧用上。 作為一門前端er,你肯定熟知 a:hover ? ??a:visited.....我還記得在小本本上記著訣竅:love 與 hate 糾纏不休,大家都懂的吧。。。。 ? ?????偽類和...
摘要:開心一刻兩頭奶牛在一起吃草,其中一頭奶牛甲越吃越慢,一副若有所思的模樣,另一頭奶牛奶牛乙發覺了,開始了對話奶牛乙擱那合計啥呢奶牛甲你幫我合計合計奶牛乙咋地了奶牛甲我吃的是草,擠出來的是奶,也就是說我把沒用的變成有用的了奶牛乙是這個事奶牛甲人開心一刻 兩頭奶牛在一起吃草,其中一頭(奶牛甲)越吃越慢,一副若有所思的模樣,另一頭奶牛(奶牛乙)發覺了,開始了對話 奶牛乙:擱那合計啥呢? 奶牛甲...
摘要:主要用來指定瀏覽器的過渡速度,以及過渡期間的操作進展情況,解釋下注意值可以中定義自己的值,如過渡效果開始前的延遲時間,單位秒或者毫秒與的巧用示例元素上浮示例元素上浮后續還會繼續補充,真心強大transition參數 語法 transition: property duration timing-function delay transition屬性是個復合屬性,她包括以下幾個子屬性: ...
摘要:我們用一些前端框架的這個控件類去顯示圖片。如果直接調用控件類的代碼那么在這張具體的圖片真正加載到本地之前,上顯示一片空白,這個用戶體驗不好。 這篇文章介紹一種使用代理設計模式(Proxy Design Pattern)的方法來改善您的前端應用里圖片加載的體驗。 假設我們的應用里需要顯示一張尺寸很大的圖片,位于遠端服務器。我們用一些前端框架的Image這個控件類去顯示圖片。如果直接調用控...
閱讀 2522·2023-04-25 17:27
閱讀 1833·2019-08-30 15:54
閱讀 2376·2019-08-30 13:06
閱讀 2986·2019-08-30 11:04
閱讀 754·2019-08-29 15:30
閱讀 736·2019-08-29 15:16
閱讀 1737·2019-08-26 10:10
閱讀 3609·2019-08-23 17:02