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

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

理解JavaScript中的Proxy 與 Reflection API

瀏覽:153日期: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久久,三上悠亚国产精品一区二区三区
亚洲午夜精品久久久久久app| 少妇精品在线| 欧美成人综合| 亚洲欧美久久| 石原莉奈在线亚洲三区| 日本一区中文字幕| 日本午夜精品一区二区三区电影| 日本不卡中文字幕| 国产精品视频一区视频二区| 日韩高清国产一区在线| 91精品美女| 精品九九在线| 99国产一区| 国产精品亚洲欧美| 999视频精品| 天海翼精品一区二区三区| 国产伦理一区| 亚洲精品一区三区三区在线观看| 怡红院精品视频在线观看极品| 视频一区二区三区入口| 久久99影视| 中文字幕av一区二区三区四区| 国产精品一区二区av日韩在线| 欧洲av一区二区| 欧美视频久久| 午夜欧美巨大性欧美巨大| 日韩精品一区二区三区免费视频 | 粉嫩av一区二区三区四区五区 | 国产精品一区二区中文字幕| 久久精品一区| 天使萌一区二区三区免费观看| 国产日韩欧美一区二区三区| 日韩成人亚洲| 国产黄色精品| 99在线观看免费视频精品观看| 日韩国产一二三区| 日韩欧美网址| 久久不卡日韩美女| 久久精品国产久精国产爱| 免费精品视频在线| 吉吉日韩欧美| 国产精品调教视频| 国产精品对白| 日韩中文字幕无砖| 偷拍亚洲精品| 亚洲日本国产| 久久亚洲欧洲| 亚洲制服少妇| 黄色亚洲精品| 欧美日韩黑人| 日韩在线视频精品| 日韩精品专区| 欧美一区二区性| 国产高清精品二区| 久久精品国产福利| 国产91在线精品| 99久久视频| 九一国产精品| 99热精品在线观看| 精品国产欧美日韩| 久久av资源| 中文字幕在线视频久| 伊人久久高清| 亚洲欧美一区在线| 免费视频最近日韩| 日韩av一二三| 91视频一区| 99国产精品免费视频观看| 国产美女高潮在线| 超级白嫩亚洲国产第一| 亚洲天堂1区| 午夜精品免费| 精品三级国产| 亚洲一区二区三区中文字幕在线观看| 国产精品.xx视频.xxtv| 亚洲精品永久免费视频| 亚洲久久一区| 国产精品日韩精品中文字幕| 免费一二一二在线视频| 欧美专区18| 九九久久国产| 久久99伊人| 精品72久久久久中文字幕| 国产精品老牛| 日韩欧美2区| 久久久久九九精品影院| 久久久久免费av| 日韩高清二区| 免费国产自久久久久三四区久久 | 亚洲欧洲午夜| 麻豆精品av| 精品一区在线| 日韩一区二区三区在线看| 婷婷成人综合| 国产极品模特精品一二| 一区二区三区四区在线看| 日韩精品亚洲专区| 狠狠干成人综合网| 精品美女视频 | 亚洲少妇在线| 国产66精品| 亚洲精品一二| 合欧美一区二区三区| 国产v日韩v欧美v| 中文久久精品| 久久久久国产精品一区三寸 | 久久青青视频| 国产日韩在线观看视频| 美女精品在线观看| 日本久久成人网| 日本精品黄色| 精品久久在线| 高清av一区| 国产精品一级| 久久国产生活片100| 日韩精品一区二区三区av| 成人日韩av| 99视频精品全部免费在线视频| 日韩三区在线| 国产精品久久久久av电视剧| 精品国产亚洲日本| 国产欧美综合一区二区三区| 国产亚洲欧美日韩在线观看一区二区| 丝袜美腿亚洲一区二区图片| 一区在线免费观看| 欧美特黄一区| 日本aⅴ亚洲精品中文乱码| 亚洲三级毛片| 国产免费av一区二区三区| 国产欧美日韩一区二区三区四区| 手机精品视频在线观看| 91精品1区| 亚洲人成毛片在线播放女女| 在线视频亚洲| 亚洲精一区二区三区| 国产麻豆精品久久| 国产 日韩 欧美一区| 深夜视频一区二区| 免费人成在线不卡| 国产日韩三级| 国产精品免费99久久久| 成人羞羞在线观看网站| 99成人在线视频| 日韩一区二区三区在线看| 国产欧美88| 日韩中文欧美| 99热免费精品| 日本在线一区二区三区| 国产精品免费大片| 亚洲黄色网址| 亚洲欧美日本国产| 日本不卡免费高清视频在线| 蜜桃视频第一区免费观看| 久久av网站| 美女久久一区| 国产精品成人一区二区不卡| 中文不卡在线| 精品久久网站| 石原莉奈在线亚洲三区| 久久中文在线| aa国产精品| 欧洲av一区二区| 国产三级一区| 日韩精品久久久久久久软件91| 福利一区在线| 国产日韩欧美一区| 夜夜嗨网站十八久久| 热三久草你在线| 日韩精品第二页| 久久精品青草| 国精品产品一区| 91精品国产一区二区在线观看| se01亚洲视频| 欧美激情视频一区二区三区在线播放| 激情婷婷久久| 亚洲天堂1区| 久久伊人久久| 国产极品模特精品一二| 影音先锋久久精品| 亚洲国产日韩欧美在线| 色爱综合av| 岛国精品一区| 国模精品一区| 久久av超碰| 欧美国产中文高清| 国产免费av一区二区三区| 亚洲一级黄色| 久久免费黄色| 日韩视频在线一区二区三区| 日本不卡免费高清视频在线| 91国内精品| 无码日韩精品一区二区免费| 欧美一区免费| 中文视频一区| 日韩高清不卡一区二区| 日韩手机在线| 国产精品午夜一区二区三区| 午夜久久av| 久久久国产精品网站| 91中文字幕精品永久在线|