Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
クラスへの割り込み処理とProxyとReflect / method-intercept-wi...
Search
hivesbee
May 24, 2019
Programming
140
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
クラスへの割り込み処理とProxyとReflect / method-intercept-with-proxy-and-reflect
初投稿です。
hivesbee
May 24, 2019
More Decks by hivesbee
See All by hivesbee
組織・プロセス・技術 フロントエンドの生産性向上への複眼的アプローチ
hivesbee
0
42
Design System Meets Vue.js
hivesbee
0
160
mabl を融和させるための取り組み in クラウドサイン / how-to-fusion-mabl-in-cloudsign
hivesbee
0
230
フロントエンドの組織について考える / think-about-front-end-organization
hivesbee
5
3k
ProgressiveにVueを導入している話 / vue-progressive-integration
hivesbee
1
670
ProgressiveにVueを導入している現場から送る小ネタ / vue-progressive-integration-tips-dialog
hivesbee
1
610
Other Decks in Programming
See All in Programming
まずはプロンプトガイドを読もう、話はそれからだ
kiakiraki
1
210
まだ間に合う!今年の夏こそSchemeのマクロ展開器を完全理解!
omasanori
0
490
【QA Test Talk Vol.8】AI-DLC による Whole Team Approach の加速
pkshadeck
PRO
0
230
freee が目指す データ マネジメント戦略 AI-Ready 時代を支える 攻めのガバナンスとは
freee
PRO
0
480
Discordを用いたラボオートメーション関連情報収集の自動化
noguhiro2002
0
430
AI Readyの正体はデータマネジメントだ メダリオン2.0の最前線
freee
PRO
0
370
Pythonの実行はどこまで賢くなったのか? CPythonとPyPyから見る最適化のしくみ
curekoshimizu
3
1.9k
DynamoDBの基礎を振り返りながらベクトル検索機能を理解する
musan
2
190
jsmini JavaScript Engine を作ってみた話
yosuke_furukawa
PRO
0
350
AI Engineeringは、AIプロダクトだけのものか? 〜AIがソフトウェアを作る時代の新しい当たり前〜 / No AI in your product. AI Engineering in your development.
rkaga
5
530
Gmail/Google DriveをトリガーにAIエージェントを動かそう! / Run AI agents with Gmail/Google Drive as triggers!
har1101
2
440
不幸な GC
chencmd
0
730
Featured
See All Featured
Rails Girls Zürich Keynote
gr2m
96
14k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.2k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
410
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
220
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
390
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
3k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.6k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.9k
Abbi's Birthday
coloredviolet
3
9.4k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.6k
Transcript
ΫϥεͷׂΓࠐΈॲཧͱ 1SPYZͱ 3FqFDU XFKT!OE .BTBTIJ)BHBʢ!)JWFTCFFʣ
⾣6ODBVHIU3FGFSFODF&SSPS)BHBJTOPUEFpOFE .BTBTIJ)BHB (JUIVCIJWFTCFF 5XJUUFS!)JWFTCFFʢ;͕͊ʣ 'SPOUFOE&OHJOFFSBU↘ &EJUPS(P-BOE $PNNBOEMPMDBU ❤7VFKT K2VFSZ /BLBNPUP
ࠓ͓͢Δ͜ͱ ϝιουʹର͢ΔׂΓࠐΈΛ࣮ͨͯ͘͠ɺ ͍Ζ͍Ζௐͯপ͚ͬͨͲɺ ݁ہγϯϓϧͳ࣮ʹͳͬͨͱ͍͏ɺ ໎͍ʹ໎ͬͨͱ͖ͷ͓ͳ͠ ࠓͷίʔυɿIUUQTKTpEEMFOFUIJWFTCFFRYHSX[
Ζ͏ͱͨ͜͠ͱ ਆʢϢʔςΟϦςΟʔΫϥεʣݴͬͨʮΤϥʔ͋Εʯ ɹ☝ͷϝιουݺͼग़࣌͠ʹνΣοΫॲཧΛ ɹט·ͤͯͦ͜ͰΤϥʔͩͬͨΒ ɹΤϥʔϋϯυϦϯά͍ͨ͠ʢ෦తʹґଘੑΛೖʣ ɹͱ͍͏ͷΛ#VTJOFTT-PHJDଆͰ࣮͍ͨ͠ 6UJM$MBTT #VTJOFTT -PHJD .FUIPE
Τϥʔ͋Ε &SSPS )BOEMFS ʢ·ͩͳ͍ʣ
Ͳ͏͠Α͏ͱ͔ͨ͠ Ҋ̍ɿ#VTJOFTT-PHJDଆͰίʔυΛॻ͚ʁ ɹˠʢϝιουݺͼग़ͨ͢ͼʹॻ͘ͷʣμϧ͘Ͷʁ Ҋ̎ɿ6UJM$MBTTͷதͰνΣοΫ͢Εʁ ɹˠʢ6UJM$MBTTͷϝιου૿͑ͨͱ͖ʹʣਏ͘Ͷʁ Ҋ̏ɿׂΓࠐΈॲཧͰղܾ͢Εʁ ɹˠͲ͏ͬͯʜʁˠ1SPYZͬͯ͋Δ͡ΌΜʂ 6UJM$MBTT #VTJOFTT -PHJD
.FUIPE Τϥʔ͋Ε &SSPS )BOEMFS ʢ·ͩͳ͍ʣ
࣮ͯ͠Έͨʢࣦഊฤʣ // ׂΓࠐΈॲཧ͞ΕΔ Utility Ϋϥε class _Util { static greet(name)
{ console.log(`hello! ${name}!`) } static throwError(...args) { console.log(‘Sample#throwError') // ͜͜ͰΤϥʔ͕ى͜Δ throw new Error(...args) } } // Proxy ʹΘͨ͢ϋϯυϥ const handler = { get(target, name, receiver) { try { interceptor() return target[name] } catch (e) { onError(e) } } } // ͍ͭ͜ΒΛ export export let interceptor // ׂΓࠐΈॲཧ༻ export let onError // Τϥʔϋϯυϥ export const Util = new Proxy(_Util, handler) // ׂΓࠐΈॲཧͷ࣮ interceptor = () => { console.log('intercept!') } onError = (e) => { console.log('onError!') console.log(e) } // ࣮ࡍʹݺͼग़͢ Util.greet('haga') Util.throwError('sample error') 6UJM$MBTTKT #VTJOFTT-PHJDKT উͬͨͳʂ ෩࿊ೖͬͯ͘Δ Χϓʔ
࣮ͯ͠Έͨʢࣦഊฤʣ JOUFSDFQU IFMMPIBHB JOUFSDFQU 4BNQMFUISPX&SSPS 6TFSTʜUFTUKT UISPXOFX&SSPS BSHT ?
&SSPSTBNQMFFSSPS BU1SPYZUISPX&SSPS 6TFSTʜUFTUKT BU0CKFDUBOPOZNPVT 6TFSTʜUFTUKT ʜ ࣮ߦͨ݁͠Ռʜ ΨνͷΤϥʔൃੜ ʢΤϥʔϋϯυϥͰݕ͍ͯ͠ͳ͍ʣ Χϓʔ
࣮ͯ͠Έͨʢࣦഊฤʣ const handler = { get(target, name, receiver) { try
{ interceptor() return target[name] } catch (e) { onError(e) } } } ݪҼʜ ϝιουͦͷ··ฦͯ͠·͢Μʜ ͦΓΌಈ͖·ͤΜΘʜ ͱͳΔͱIBOEMFSͰॲཧͤͯ͋͛͞ͳ͍ͱʜ ˠͦ͏͍͑3FqFDUͬͯ͋ͬͨͳʜ
࣮ͯ͠Έͨʢޭʁฤʣ const handler = { get(target, name, receiver) { return
(...args) => { const apiMethod = Reflect.get(target, name, receiver) const boundApiMethod = apiMethod.bind(target) try { interceptor() return boundApiMethod(...args) } catch (e) { onError(e) } } } } const handler = { get(target, name, receiver) { try { interceptor() return target[name] } catch (e) { onError(e) } } } 3FqFDUHFUͰϝιουΛऔΓग़ͯ͠ॲཧ ΤϥʔϋϯυϦϯά·ͰؚΊͨॲཧΛSFUVSO ͔ͬͨʁ Χϓʔ #FGPSF "GUFS ˠ;ͭʔʹಈ͍ͨ
͖ͬ͞ʢ̑࣌ؒલʣࢥͬͨ͜ͱ͚ͩͲ ͪΐͬͱ·ͬͯ ͜Εͬͯ3FqFDUͱ͍͏ΑΓϞδϡʔϧͰॻ͍͔ͨΒ͡ΌͶʁ ͱɺ͍͏͜ͱͰ 3FqFDUͷॲཧΛͯ͠ϞδϡʔϧΛSFUVSO͢Δͱ͚࣮ͩ͜
࣮ͯ͠Έͨʢޭฤʣ const handler = { get(target, name, receiver) { return
(...args) => { try { interceptor() return target[name](...args) } catch (e) { onError(e) } } } } ಈ͍ͨΑʜ ʢमਖ਼ͷϓϧϦΫग़͞ͳ͖Όʜʣ Χϓʔ
·ͱΊ ɾ1SPYZ͚ͩͰׂΓࠐΈॲཧͰ͖Δ ɹ͋Εɺ3FqFDUͬͯͳΜͩʜ ɾਖ਼ɺ͚ࣗͩͰߟ͑ͯ࡞͔ͬͨΒ͜Ε͕ ɹϕετϓϥΫςΟε͔Ͳ͏͔ϫΧϥϯ ɾ;ͩΜ7VFʹ͓ΜͿʹ͔ͩͬͩ͜Βٱ͠ͿΓʹপͬͨ ɾ*OWFSTJGZ+4ʜ ɹͬͪ͜ͷ΄͏ָ͕ʹॻ͚ΔΜͰ͔͢ʜʁ ɹ˞ࡢௐͨ͠Βग़͖ͯͨʜৄ͍͠ਓڭ͑ͯʜ
͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ Χϓʔʂ