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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
hivesbee
May 24, 2019
Programming
130
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
38
Design System Meets Vue.js
hivesbee
0
160
mabl を融和させるための取り組み in クラウドサイン / how-to-fusion-mabl-in-cloudsign
hivesbee
0
220
フロントエンドの組織について考える / think-about-front-end-organization
hivesbee
5
3k
ProgressiveにVueを導入している話 / vue-progressive-integration
hivesbee
1
660
ProgressiveにVueを導入している現場から送る小ネタ / vue-progressive-integration-tips-dialog
hivesbee
1
600
Other Decks in Programming
See All in Programming
エージェンティックRAGにAWSで入門しよう!
har1101
8
1.6k
Signal Forms: Details & Live Coding @enterJS 2026 in Mannheim
manfredsteyer
PRO
0
160
Go1.27で導入されるジェネリクスメソッドでできること
mackee
0
140
代数的データ型って何が嬉しいの? #frontend_phpcon_do
kajitack
8
3.7k
AIだと陥りがちなJakarta EE最新技術への移行時の落とし穴と解決策
tnagao7
0
110
フロントエンドとバックエンドで「1文字」を揃えよう
youkidearitai
PRO
0
710
AI 輔助遺留系統現代化的經驗分享
jame2408
1
610
The NotImplementedError Problem in Ruby
koic
1
820
ローカルLLMでどこまでコードが書けるか -拡張版 / How much code can be written on a local LLM Extended
kishida
11
4.3k
技術的負債解消で開発者の未来を開く- AIの力でコード刷新
kmd2kmd
0
100
Inside Stream API
skrb
1
730
ECSアプリログをFireLensでコスト削減しようとしたけど諦めた話 in Fargate×Node.js
akihisaikeda
2
4.2k
Featured
See All Featured
Speed Design
sergeychernyshev
33
1.9k
Rails Girls Zürich Keynote
gr2m
96
14k
A Soul's Torment
seathinner
6
3k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
201
75k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.3k
RailsConf 2023
tenderlove
30
1.5k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Being A Developer After 40
akosma
91
590k
Google's AI Overviews - The New Search
badams
0
1k
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.9k
What's in a price? How to price your products and services
michaelherold
247
13k
How to Ace a Technical Interview
jacobian
281
24k
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ʜ ɹͬͪ͜ͷ΄͏ָ͕ʹॻ͚ΔΜͰ͔͢ʜʁ ɹ˞ࡢௐͨ͠Βग़͖ͯͨʜৄ͍͠ਓڭ͑ͯʜ
͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ Χϓʔʂ