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