国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Proxy 的巧用

feng409 / 1732人閱讀

摘要:為了保證的可讀性,本文采用意譯而非直譯。對象的所有用法,都是上面的這種形式。其中用來生成實(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.xtarget["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

相關(guān)文章

  • Proxy 巧用

    摘要:為了保證的可讀性,本文采用意譯而非直譯。對象的所有用法,都是上面的這種形式。其中用來生成實(shí)例,是表示所要攔截的對象,是用來定制攔截行為的對象。雖然不同的創(chuàng)建模式支持類似的功能,但無法用隱式初始值包裝對象。 為了保證的可讀性,本文采用意譯而非直譯。 想閱讀更多優(yōu)質(zhì)文章請猛戳GitHub博客,一年百來篇優(yōu)質(zhì)文章等著你! Proxy 介紹 使用Proxy,你可以將一只貓偽裝成一只老虎。下面大...

    FreeZinG 評論0 收藏0
  • CSS(一)偽元素巧用

    摘要:并且,一些偽元素可以使開發(fā)者獲取到不存在于源文檔中的內(nèi)容比如常見的還可以為偽元素定制樣式。。中新增加的偽元素必須用偽類使用一個(gè)冒號例如。就本文而言,我們將把我們探討的范圍限制在和這兩個(gè)偽元素的巧用上。 作為一門前端er,你肯定熟知 a:hover ? ??a:visited.....我還記得在小本本上記著訣竅:love 與 hate 糾纏不休,大家都懂的吧。。。。 ? ?????偽類和...

    entner 評論0 收藏0
  • 異或運(yùn)算巧用 → 不用額外的變量,如何交換兩個(gè)變量的值?

    摘要:開心一刻兩頭奶牛在一起吃草,其中一頭奶牛甲越吃越慢,一副若有所思的模樣,另一頭奶牛奶牛乙發(fā)覺了,開始了對話奶牛乙擱那合計(jì)啥呢奶牛甲你幫我合計(jì)合計(jì)奶牛乙咋地了奶牛甲我吃的是草,擠出來的是奶,也就是說我把沒用的變成有用的了奶牛乙是這個(gè)事奶牛甲人開心一刻  兩頭奶牛在一起吃草,其中一頭(奶牛甲)越吃越慢,一副若有所思的模樣,另一頭奶牛(奶牛乙)發(fā)覺了,開始了對話  奶牛乙:擱那合計(jì)啥呢?  奶牛甲...

    不知名網(wǎng)友 評論0 收藏0
  • CSS3-transition常用屬性及示例

    摘要:主要用來指定瀏覽器的過渡速度,以及過渡期間的操作進(jìn)展情況,解釋下注意值可以中定義自己的值,如過渡效果開始前的延遲時(shí)間,單位秒或者毫秒與的巧用示例元素上浮示例元素上浮后續(xù)還會繼續(xù)補(bǔ)充,真心強(qiáng)大transition參數(shù) 語法 transition: property duration timing-function delay transition屬性是個(gè)復(fù)合屬性,她包括以下幾個(gè)子屬性: ...

    derek_334892 評論0 收藏0
  • 巧用代理設(shè)計(jì)模式(Proxy Design Pattern)改善前端圖片加載體驗(yàn)

    摘要:我們用一些前端框架的這個(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)用控...

    dackel 評論0 收藏0

發(fā)表評論

0條評論

feng409

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<