質問編集履歴
1
最終的なコードの追加
title
CHANGED
File without changes
|
body
CHANGED
@@ -60,11 +60,11 @@
|
|
60
60
|
```js
|
61
61
|
setListener(){
|
62
62
|
const self = this
|
63
|
-
const
|
63
|
+
const listener_wrapper = function(eve){
|
64
64
|
listener.call(this, eve, self)
|
65
65
|
}
|
66
|
-
wmap.set(this,
|
66
|
+
wmap.set(this, listener_wrapper)
|
67
|
-
window.addEventListener("click",
|
67
|
+
window.addEventListener("click", listener_wrapper, false)
|
68
68
|
}
|
69
69
|
```
|
70
70
|
```js
|
@@ -73,4 +73,36 @@
|
|
73
73
|
|
74
74
|
たかだかリスナにオブジェクト参照をもたせたいだけでこんなに変更するのはなにか違う気がします。
|
75
75
|
|
76
|
-
書いてて無理そうな気もしてきたのですが、なにか方法がありそうにも思います。
|
76
|
+
書いてて無理そうな気もしてきたのですが、なにか方法がありそうにも思います。
|
77
|
+
|
78
|
+
# 追記
|
79
|
+
|
80
|
+
最終的にどうなっている状態かがわかりづらいため全体のコードを追記します。
|
81
|
+
また、上記コードで `listener` が重複していたので修正しました。
|
82
|
+
|
83
|
+
```js
|
84
|
+
const wmap = new WeakMap()
|
85
|
+
|
86
|
+
class X {
|
87
|
+
setListener(){
|
88
|
+
const self = this
|
89
|
+
const listener_wrapper = function(eve){
|
90
|
+
listener.call(this, eve, self)
|
91
|
+
}
|
92
|
+
wmap.set(this, listener_wrapper)
|
93
|
+
window.addEventListener("click", listener_wrapper, false)
|
94
|
+
}
|
95
|
+
removeListener(){
|
96
|
+
window.removeEventListener("click", wmap.get(this), false)
|
97
|
+
}
|
98
|
+
}
|
99
|
+
|
100
|
+
function listener(eve, x){
|
101
|
+
x.prop = eve.target
|
102
|
+
console.log(x)
|
103
|
+
}
|
104
|
+
|
105
|
+
export { X }
|
106
|
+
```
|
107
|
+
|
108
|
+
補足すると EsModules のモジュールのため、 wmap はこのファイル外には公開されていません。
|