teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

追記が蛇足だったので取り消し

2020/10/16 10:29

投稿

_._
_._

スコア36

answer CHANGED
@@ -49,66 +49,4 @@
49
49
  proxiedTarget.active = !proxiedTarget.active
50
50
 
51
51
  proxiedTarget.handleEvent({ type: 'focus' })
52
- ```
53
-
54
- ---
55
-
56
- 追記(汎用化?)
57
-
58
- ```javascript
59
- const Target = class {
60
- #element
61
- #active
62
- constructor(element) {
63
- this.#element = element
64
- element.addEventListener('focus', this)
65
- element.addEventListener('blur', this)
66
- }
67
- get element() {
68
- return this.#element
69
- }
70
- get active() {
71
- return !!this.#active
72
- }
73
- set active(bool) {
74
- this.#active = bool
75
- }
76
- handleEvent({ type }) {
77
- console.log(type + ' before', this.active)
78
- this.active = type === 'focus'
79
- console.log(type + ' after', this.active)
80
- }
81
- }
82
-
83
- const handler = {
84
- get(target, key, receiver) {
85
- return target[ key ]
86
- },
87
- set(target, key, value, receiver) {
88
- console.log('YES!', { target, key, value, receiver }) //何らかの処理
89
- target[ key ] = value
90
- return true
91
- }
92
- }
93
-
94
- const proxied = target => class extends target {
95
- constructor(...arg) {
96
- super(...arg)
97
- const proxiedTarget = new Proxy(this, handler)
98
- typeof this.handleEvent === 'function' && (this.handleEvent = this.handleEvent.bind(proxiedTarget))
99
- return proxiedTarget
100
- }
101
- }
102
-
103
- const ProxiedTarget = proxied(Target)
104
-
105
- const element = document.body.appendChild(document.createElement('textarea'))
106
-
107
- const proxiedTarget = new ProxiedTarget(element)
108
-
109
- proxiedTarget.active = !proxiedTarget.active
110
-
111
- proxiedTarget.active = !proxiedTarget.active
112
-
113
- proxiedTarget.handleEvent({ type: 'focus' })
114
52
  ```

1

コードの追加

2020/10/16 10:29

投稿

_._
_._

スコア36

answer CHANGED
@@ -49,4 +49,66 @@
49
49
  proxiedTarget.active = !proxiedTarget.active
50
50
 
51
51
  proxiedTarget.handleEvent({ type: 'focus' })
52
+ ```
53
+
54
+ ---
55
+
56
+ 追記(汎用化?)
57
+
58
+ ```javascript
59
+ const Target = class {
60
+ #element
61
+ #active
62
+ constructor(element) {
63
+ this.#element = element
64
+ element.addEventListener('focus', this)
65
+ element.addEventListener('blur', this)
66
+ }
67
+ get element() {
68
+ return this.#element
69
+ }
70
+ get active() {
71
+ return !!this.#active
72
+ }
73
+ set active(bool) {
74
+ this.#active = bool
75
+ }
76
+ handleEvent({ type }) {
77
+ console.log(type + ' before', this.active)
78
+ this.active = type === 'focus'
79
+ console.log(type + ' after', this.active)
80
+ }
81
+ }
82
+
83
+ const handler = {
84
+ get(target, key, receiver) {
85
+ return target[ key ]
86
+ },
87
+ set(target, key, value, receiver) {
88
+ console.log('YES!', { target, key, value, receiver }) //何らかの処理
89
+ target[ key ] = value
90
+ return true
91
+ }
92
+ }
93
+
94
+ const proxied = target => class extends target {
95
+ constructor(...arg) {
96
+ super(...arg)
97
+ const proxiedTarget = new Proxy(this, handler)
98
+ typeof this.handleEvent === 'function' && (this.handleEvent = this.handleEvent.bind(proxiedTarget))
99
+ return proxiedTarget
100
+ }
101
+ }
102
+
103
+ const ProxiedTarget = proxied(Target)
104
+
105
+ const element = document.body.appendChild(document.createElement('textarea'))
106
+
107
+ const proxiedTarget = new ProxiedTarget(element)
108
+
109
+ proxiedTarget.active = !proxiedTarget.active
110
+
111
+ proxiedTarget.active = !proxiedTarget.active
112
+
113
+ proxiedTarget.handleEvent({ type: 'focus' })
52
114
  ```