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
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
610
Other Decks in Programming
See All in Programming
自動化したのに回らないテスト運用の壁ーAI時代の品質責任と生産性
mfunaki
0
120
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
470
「寝てても仕事が進む」Claude Codeで組む第二の脳
tomoyafujita2016
0
280
『コードを書く以外の』エンジニアリング〜課金基盤移行プロジェクト推進のためのTips4選
yuriko1211
0
570
ドリフトを絶対に許さない(?)CDK運用 / CDK Ops with Zero Tolerance for Drifts (?)
akihisaikeda
1
170
ソフトウェア設計に溶けるインフラ ― AWS CDK のインフラ認識論
konokenj
3
750
JAWS-UG横浜 #102 AWSサ終供養LT会 成仏できない AWS サービスたち 〜本日、三体供養します〜
maroon1st
0
310
FDEが実現するAI駆動経営の現在地
gonta
2
250
GDG Korea Android: 2026 I/O Extended ~ What's new in Android development tools
pluu
0
210
PHPだって関数型したい 〜できること、できないこと〜 / fp-in-php
jsoizo
1
270
PostgreSQL 18で考えるUUID主キー
kazuhiro1982
0
450
仕様書を書く前にハーネスを作る - Agent Native開発は「探索を速く、判定を固く」
gotalab555
4
1.5k
Featured
See All Featured
Exploring anti-patterns in Rails
aemeredith
3
450
Rails Girls Zürich Keynote
gr2m
96
14k
Building Flexible Design Systems
yeseniaperezcruz
330
40k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Making Projects Easy
brettharned
120
6.7k
The untapped power of vector embeddings
frankvandijk
2
1.8k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.7k
We Have a Design System, Now What?
morganepeng
55
8.2k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.1k
Art, The Web, and Tiny UX
lynnandtonic
304
22k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.9k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.1k
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ʜ ɹͬͪ͜ͷ΄͏ָ͕ʹॻ͚ΔΜͰ͔͢ʜʁ ɹ˞ࡢௐͨ͠Βग़͖ͯͨʜৄ͍͠ਓڭ͑ͯʜ
͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ Χϓʔʂ