すべてのプロパティでセッターが呼ばれたときに処理を追加したい
すべてのプロパティでセッターが呼ばれたときに処理を追加したいのですが、addEventListenerを経由するとうまくいきません。
javascript
1const Target = class { 2 constructor(element) { 3 this._element = element 4 element.addEventListener('focus', this) 5 element.addEventListener('blur', this) 6 } 7 get element() { 8 return this._element 9 } 10 get active() { 11 return !!this._active 12 } 13 set active(bool) { 14 this._active = bool 15 } 16 handleEvent({ type }) { 17 console.log(type + ' before', this.active) 18 this.active = type === 'focus' 19 console.log(type + ' after', this.active) 20 } 21} 22 23const handler = { 24 get(target, key) { 25 return target[ key ] 26 }, 27 set(target, key, value) { 28 console.log('YES!', { target, key, value }) //何らかの処理 29 target[ key ] = value 30 return true 31 } 32} 33 34const element = document.body.appendChild(document.createElement('textarea')) 35 36const proxiedTarget = new Proxy(new Target(element), handler) 37 38proxiedTarget.active = !proxiedTarget.active //OK 39 40proxiedTarget.active = !proxiedTarget.active //OK 41 42proxiedTarget.handleEvent({ type: 'focus' }) //OK //addEventListener用ですが確認のため直接実行 43 44//クリック等で要素をフォーカス・ブラーさせてaddEventListener経由でhandleEventが実行されるとhandler.setが反応しない><
上記の例ではプロパティは「active」一つだけですが実際は(継承元も含めて)たくさんあるのでProxyで一括処理できないかなと思いました。
が、handleEventメソッドを直接呼ぶ場合はメソッド内の「this.active = type === 'focus'
」に反応して期待通りにhandlerの処理が行われるのですが、
addEventListener経由で呼ばれる場合はProxyにラップされていないのかhandlerの処理が行われません。
addEventListener経由でもトラップするにはどうすればいいですか?
あと、
javascript
1const proxiedTarget = new Proxy(new Target(element), handler)
ではなく
javascript
1const ProxiedTarget = new Proxy(Target, handler) 2const proxiedTarget = new ProxiedTarget(element)
みたいにできますか?(Proxyのターゲットとしてインスタンスじゃなくクラスを渡しても実現可能ですか?)
やりたいことがもっと短いコードでかんたんに実現できるならProxyじゃなくても何でもいいです。
回答2件
あなたの回答
tips
プレビュー