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

質問編集履歴

1

最終的なコードの追加

2018/04/15 03:09

投稿

lazex
lazex

スコア604

title CHANGED
File without changes
body CHANGED
@@ -60,11 +60,11 @@
60
60
  ```js
61
61
  setListener(){
62
62
  const self = this
63
- const listener = function(eve){
63
+ const listener_wrapper = function(eve){
64
64
  listener.call(this, eve, self)
65
65
  }
66
- wmap.set(this, listener)
66
+ wmap.set(this, listener_wrapper)
67
- window.addEventListener("click", listener, false)
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 はこのファイル外には公開されていません。