日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

理解JavaScript中的Proxy 與 Reflection API

瀏覽:151日期:2023-10-12 11:17:19

一、創建 Proxy

let target = {}let proxy = new Proxy(target, {})proxy.name = 'proxy'console.log(proxy.name) // proxyconsole.log(target.name) // proxytarget.name = 'target'console.log(proxy.name) // targetconsole.log(target.name) // target

在上面的例子中,由 Proxy 構造器創建的 proxy 對象會將自身的所有操作直接轉發給 target。當 proxy.name 被賦值為 'proxy' 時,target 對象也會創建 name 屬性并獲得同樣的值。實際上 proxy 對象本身并不創建和存儲 name 屬性,它只是轉發對應的操作給 target。

類似的,proxy.name 與 target.name 的值始終保持一致,因為它們實際上都指向了 target.name。這也意味著給 target.name 賦予一個新的值時,該變化也會反映到 proxy.name 上。

使用 set Trap 驗證屬性

Proxy 允許開發者主動攔截本該轉發給 target 對象的底層操作,這些攔截行為通過 trap 實現。每個 trap 都可以覆蓋 JavaScript 對象的某些內置行為,即 proxy 允許通過 trap 攔截并修改指向 target 對象的操作。

假設需要創建一個新添加的屬性值只能是數字類型的對象,就可以借助 set trap 覆蓋默認的賦值行為。代碼如下:

let target = { name: 'target'}let proxy = new Proxy(target, { set(trapTarget, key, value, receiver) { if (!trapTarget.hasOwnProperty(key)) { if (isNaN(value)) { throw new TypeError('New property must be a number.') } } return Reflect.set(trapTarget, key, value, receiver) }})proxy.count = 1console.log(proxy.count) // 1console.log(target.count) // 1proxy.name = 'proxy'console.log(proxy.name) // proxyconsole.log(target.name) // proxyproxy.anotherName = 'proxy'// TypeError: New property must be a number.

set trap 中的四個參數含義如下:

trapTarget:接收新屬性的對象(即 proxy 指向的 target) key:新屬性對應的 key value:新屬性對應的 value receiver:通常為 proxy 自身

Reflect.set() 是與 set trap 相對應的原始方法,表示被覆蓋前的默認的賦值行為。

使用 get Trap 令程序讀取不存在屬性時報錯

JavaScript 在讀取不存在的屬性時并不會報錯,而是返回 undefined。

let target = {}console.log(target.name) // undefined

可以借助 get trap 修改讀取對象屬性時的默認行為:

let proxy = new Proxy({}, { get(trapTarget, key, receiver) { if (!(key in receiver)) { throw new TypeError('Property ' + key + ' doesn’t exist.') } return Reflect.get(trapTarget, key, receiver) }})proxy.name = 'proxy'console.log(proxy.name) // proxyconsole.log(proxy.nme)// TypeError: Property nme doesn’t exist.

通過 deleteProperty Trap 防止刪除屬性

JavaScript 中使用 delete 操作符刪除對象的屬性:

let target = { name: 'target', value: 42}Object.defineProperty(target, 'name', { configurable: false })console.log('value' in target) // truelet result1 = delete target.valueconsole.log(result1) // trueconsole.log('value' in target) // falselet result2 = delete target.nameconsole.log(result2) // falseconsole.log('name' in target) // true

使用 deleteProxy Trap 防止屬性被意外刪除:

let target = { name: 'target', value: 42}let proxy = new Proxy(target, { deleteProperty(trapTarget, key) { if (key === 'value') { return false } else { return Reflect.deleteProperty(trapTarget, key) } }})console.log('value' in proxy) // truelet result1 = delete proxy.valueconsole.log(result1) // falseconsole.log('value' in proxy) // truelet result2 = delete proxy.nameconsole.log(result2) // trueconsole.log('name' in proxy) // false

二、Proxy 的現實應用

logging

function makeLoggable(target) { return new Proxy(target, { get: (target, property) => { console.log('Reading ' + property) return target[property] }, set: (target, property, value) => { console.log('Writing value ' + value + ' to ' + property) target[property] = value } })}let ninja = { name: 'Yoshi' }ninja = makeLoggable(ninja)console.log(ninja.name)ninja.weapon = 'sword'// Reading name// Yoshi// Writing value sword to weapon

性能測試

function isPrime(number) { if (number < 2) { return false } for (let i = 2; i < number; i++) { if (number % i === 0) { return false } } return true}isPrime = new Proxy(isPrime, { apply: (target, thisArg, args) => { console.time('isPrime') const result = target.apply(thisArg, args) console.timeEnd('isPrime') return result }})console.log(isPrime(1358765377))// isPrime: 6815.107ms// true

自動添加屬性

function Folder() { return new Proxy({}, { get: (target, property) => { console.log('Reading ' + property) if(!(property in target)) { target[property] = new Folder() } return target[property] } })}const rootFolder = new Folder()rootFolder.ninjasDir.firstNinjaDir.ninjaFile = 'yoshi.txt'// Reading ninjasDir// Reading firstNinjaDirconsole.log(rootFolder.ninjasDir.firstNinjaDir.ninjaFile)// Reading ninjasDir// Reading firstNinjaDir// Reading ninjaFile// yoshi.txt

參考資料

https://leanpub.com/understandinges6

https://www.manning.com/books/secrets-of-the-javascript-ninja-second-edition

以上就是理解JavaScript中的Proxy 與 Reflection API的詳細內容,更多關于JavaScript中的Proxy 與 Reflection API的資料請關注好吧啦網其它相關文章!

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲一区免费| 国产在线看片免费视频在线观看| 麻豆精品视频在线观看视频| 成人美女视频| 成人污污视频| 国产美女高潮在线观看| 色在线视频观看| 欧美日中文字幕| 免费精品国产| 在线一区二区三区视频| 日韩精品久久理论片| 国产亚洲欧美日韩精品一区二区三区| 亚洲三级视频| 97久久亚洲| 国产高清日韩| 麻豆网站免费在线观看| 色狠狠一区二区三区| 久久精品av麻豆的观看方式| 91国内精品| 精品国产亚洲一区二区三区在线 | 亚洲免费毛片| 日韩不卡视频在线观看| 另类av一区二区| 久久国产精品免费一区二区三区| 日韩精品亚洲专区| 欧美天堂亚洲电影院在线观看| 中文字幕日韩亚洲| 日本久久黄色| 伊人久久亚洲| 日本综合字幕| 欧美一区二区性| 国产日韩三级| 国产一区二区三区四区| 岛国av在线网站| 天堂资源在线亚洲| 日韩国产91| 18国产精品| 日韩a一区二区| 麻豆传媒一区二区三区| 一级欧洲+日本+国产| 日本午夜精品| 国产精品视频一区视频二区| 日本综合精品一区| 999国产精品999久久久久久| 蜜臀va亚洲va欧美va天堂| 国产精品亚洲产品| 99成人在线视频| 日韩av资源网| 亚洲伊人av| 色综合视频一区二区三区日韩 | 国产精品黑丝在线播放| 欧美成人日韩| 久久精品97| 久久亚洲在线| 欧美日韩精品一区二区三区在线观看| 日韩av专区| 亚洲精品在线国产| 日韩成人a**站| 亚洲乱码久久| 日韩亚洲一区在线| 日本欧美韩国一区三区| 久久久成人网| 久久精品 人人爱| 激情欧美亚洲| 麻豆精品在线| 99pao成人国产永久免费视频| 国产日韩欧美高清免费| 亚洲午夜精品久久久久久app| 欧美一区久久| 伊人影院久久| 久久亚洲人体| 亚洲人妖在线| 久久免费大视频| 日韩1区2区日韩1区2区| 日韩午夜av| 欧美好骚综合网| 欧美亚洲福利| 麻豆久久精品| 久久久成人网| 精品三级av| 日韩三区四区| 影院欧美亚洲| 国产精品一国产精品k频道56| 精品久久亚洲| 欧美精品黄色| 久久不见久久见国语| 精品久久久网| 久久精品影视| 亚洲一区二区三区免费在线观看| 日韩视频1区| 国产不卡一区| 日韩精品一区二区三区中文在线| 国产精品.xx视频.xxtv| 一区二区亚洲精品| 欧美精品福利| 午夜亚洲精品| 国产欧洲在线| 欧美日韩1区| 蜜臀av一区二区三区| 99久久精品网| 偷拍精品精品一区二区三区| 日本伊人午夜精品| 亚洲一级影院| 91精品国产乱码久久久久久久| 国产精品17p| 奇米亚洲欧美| 日韩欧美另类一区二区| 精品中文在线| 国产日韩三级| 国产午夜久久av| 婷婷综合福利| 午夜欧美精品久久久久久久| 欧美性感美女一区二区| 日韩国产欧美| 成人国产精品| 久久国产精品免费一区二区三区 | 国产亚洲一区二区手机在线观看 | 97精品在线| 91精品啪在线观看国产爱臀| 国产白浆在线免费观看| 美女国产精品久久久| 日韩不卡免费高清视频| 高清av一区| 精品一区电影| 久久免费高清| 五月天久久久| 日韩免费精品| 欧美黄页在线免费观看| 欧美精品国产白浆久久久久| 一区二区三区四区日本视频| 亚洲福利免费| 午夜精品成人av| 久久婷婷国产| 欧美一区=区三区| 91亚洲国产| 日韩成人亚洲| 国产中文字幕一区二区三区| 国产精品蜜芽在线观看| 欧美a一区二区| 丁香婷婷久久| 国产精品99视频| xxxxx性欧美特大| 激情偷拍久久| 亚洲综合日韩| 久久中文字幕二区| 麻豆91小视频| 久久精品国产68国产精品亚洲| 日韩va亚洲va欧美va久久| 91成人精品观看| 久久精品亚洲| 91欧美在线| 天堂√8在线中文| 91精品国产乱码久久久久久久| 亚洲成人一区| 首页亚洲欧美制服丝腿| 日本成人一区二区| 免费一级欧美片在线观看网站 | 噜噜噜久久亚洲精品国产品小说| 亚洲九九精品| 精品黄色一级片| 激情婷婷欧美| 日韩高清欧美激情| 久久中文欧美| 激情婷婷欧美| 国产日产一区| 99久久久久国产精品| 亚洲精品三级| 国产不卡精品在线| 午夜在线一区二区| 欧美精品97| 国产精品7m凸凹视频分类| 日韩av字幕| 999国产精品视频| 亚洲精品护士| 国产成人久久精品麻豆二区 | 亚洲在线一区| 欧美片网站免费| 日本少妇一区| 日韩高清在线不卡| 日韩大片在线观看| 日韩精品导航| 精品成人免费一区二区在线播放| 亚洲久草在线| 电影亚洲精品噜噜在线观看 | 国产亚洲精品v| 国产精品白浆| 日韩午夜av在线| 精品淫伦v久久水蜜桃| 久久亚洲色图| 精品久久久亚洲| 综合一区av| 欧美羞羞视频| 欧美日韩一视频区二区| 国产综合婷婷| 麻豆精品新av中文字幕| 久久高清免费观看| 福利一区在线| 少妇精品久久久一区二区三区| 美日韩精品视频| 蜜桃传媒麻豆第一区在线观看|