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

回答編集履歴

4

コード事例を追記

2017/03/12 15:57

投稿

think49
think49

スコア18194

answer CHANGED
@@ -14,4 +14,56 @@
14
14
  プリミティブ値で良ければ、定義済みの `data-*` 属性を使う事も検討に値すると思います。
15
15
  `WeakMap` とは逆にスコープが解放されているのが特徴で他の機能からも参照できるのでうまく使い分けると良いでしょう。
16
16
 
17
+ ### コード事例
18
+
19
+ - [要素ノードに複数の値を関連付ける - JSFiddle](https://jsfiddle.net/bvboh7ud/)
20
+
21
+ ```JavaScript
22
+ 'use strict';
23
+ var mylibraryA = {name: 'A', value: 'foo', flag: true},
24
+ mylibraryB = {name: 'B', value: 'bar', flag: false},
25
+ map = new Map([['mylibraryA', mylibraryA], ['mylibraryB', mylibraryB]]),
26
+ p;
27
+
28
+ /**
29
+ * property
30
+ */
31
+ p = document.createElement('p');
32
+ map.forEach((object, name) => {
33
+ for (let key of Object.keys(object)) {
34
+ p[name + '-' + key] = object[key];
35
+ }
36
+ })
37
+ console.log(JSON.stringify(Object.keys(p))); // ["mylibraryA-name", "mylibraryA-value", "mylibraryA-flag", "mylibraryB-name", "mylibraryB-value", "mylibraryB-flag"]
38
+
39
+ /**
40
+ * data-* attribute
41
+ */
42
+ p = document.createElement('p');
43
+ map.forEach((object, name) => {
44
+ for (let key of Object.keys(object)) {
45
+ p.setAttribute('data-' + name + '-' + key, object[key]);
46
+ }
47
+ })
48
+ console.log(p.outerHTML); // <p data-mylibrarya-name="A" data-mylibrarya-value="foo" data-mylibrarya-flag="true" data-mylibraryb-name="B" data-mylibraryb-value="bar" data-mylibraryb-flag="false"></p>
49
+
50
+ /**
51
+ * data-* attribute + JSON
52
+ */
53
+ p = document.createElement('p');
54
+ map.forEach((object, name) => {
55
+ p.setAttribute('data-' + name, JSON.stringify(object));
56
+ })
57
+ console.log(p.outerHTML); // <p data-mylibrarya="{&quot;name&quot;:&quot;A&quot;,&quot;value&quot;:&quot;foo&quot;,&quot;flag&quot;:true}" data-mylibraryb="{&quot;name&quot;:&quot;B&quot;,&quot;value&quot;:&quot;bar&quot;,&quot;flag&quot;:false}"></p>
58
+
59
+ /**
60
+ * WeakMap
61
+ */
62
+ p = document.createElement('p');
63
+ var wmapA = new WeakMap([[p, mylibraryA]]),
64
+ wmapB = new WeakMap([[p, mylibraryB]]);
65
+ console.log(JSON.stringify(wmapA.get(p))); // {name: "A", value: "foo", flag: true}
66
+ console.log(JSON.stringify(wmapB.get(p))); // {name: "B", value: "bar", flag: false}
67
+ ```
68
+
17
69
  Re: lazex さん

3

markdown修正

2017/03/12 15:57

投稿

think49
think49

スコア18194

answer CHANGED
@@ -7,7 +7,7 @@
7
7
 
8
8
  `WeakMap` の使いどころはスコープを分割できることにあり、ユーザから値を隠す目的で使うものではないと思います。
9
9
  例えば、 `<p id="sample">` に対して a.js と b.js が別々の `WeakMap` を定義すれば、それぞれ独立したスコープで値を埋め込む事が出来ます。
10
- a.js で埋め込んだ WeakMap 値が b.js で埋め込んだ WeakMap 値と衝突する可能性はゼロです。
10
+ **a.js で埋め込んだ WeakMap 値が b.js で埋め込んだ WeakMap 値と衝突する可能性はゼロ**です。
11
11
 
12
12
  ### data-* 属性
13
13
 

2

typo修正

2017/03/06 14:37

投稿

think49
think49

スコア18194

answer CHANGED
@@ -1,12 +1,13 @@
1
1
  ### WeakMap
2
2
 
3
3
  要素ノードのプロパティに値を格納した場合、**将来的に同じ名前のプロパティが拡張された場合に衝突する危険性**があります。
4
- `WeakMap` は要素ノード自信を拡張するわけではないので、要素ノードにどんなプロパティが定義されても自由に設定できます。
4
+ `WeakMap` は要素ノードそのものを拡張するわけではないので、要素ノードにどんなプロパティが定義されても自由に設定できます。
5
5
 
6
6
  > Closure に隠す理由には「開発者ツールで内部のデータ見るような人に見られたり編集されたくない」というのもあるようですが(ゲームとか?)、開発者ツールで WeakMap が見えるスコープのところに breakpoint 置いて REPL で操作できるので意味ないです。
7
7
 
8
- `WeakMap` の使いどころはスコープを分割できることにあり、ユーザから見えなくるのが目的ではないと思います。
8
+ `WeakMap` の使いどころはスコープを分割できることにあり、ユーザから値を隠す目的で使うものではないと思います。
9
9
  例えば、 `<p id="sample">` に対して a.js と b.js が別々の `WeakMap` を定義すれば、それぞれ独立したスコープで値を埋め込む事が出来ます。
10
+ a.js で埋め込んだ WeakMap 値が b.js で埋め込んだ WeakMap 値と衝突する可能性はゼロです。
10
11
 
11
12
  ### data-* 属性
12
13
 

1

`WeakMap` の使いどころ

2017/03/06 14:36

投稿

think49
think49

スコア18194

answer CHANGED
@@ -1,7 +1,16 @@
1
+ ### WeakMap
2
+
1
3
  要素ノードのプロパティに値を格納した場合、**将来的に同じ名前のプロパティが拡張された場合に衝突する危険性**があります。
2
4
  `WeakMap` は要素ノード自信を拡張するわけではないので、要素ノードにどんなプロパティが定義されても自由に設定できます。
3
5
 
6
+ > Closure に隠す理由には「開発者ツールで内部のデータ見るような人に見られたり編集されたくない」というのもあるようですが(ゲームとか?)、開発者ツールで WeakMap が見えるスコープのところに breakpoint 置いて REPL で操作できるので意味ないです。
7
+
8
+ `WeakMap` の使いどころはスコープを分割できることにあり、ユーザから見えなくするのが目的ではないと思います。
9
+ 例えば、 `<p id="sample">` に対して a.js と b.js が別々の `WeakMap` を定義すれば、それぞれ独立したスコープで値を埋め込む事が出来ます。
10
+
11
+ ### data-* 属性
12
+
4
- また、プリミティブ値で良ければ、定義済みの `data-*` 属性を使う事も検討に値すると思います。
13
+ プリミティブ値で良ければ、定義済みの `data-*` 属性を使う事も検討に値すると思います。
5
14
  `WeakMap` とは逆にスコープが解放されているのが特徴で他の機能からも参照できるのでうまく使い分けると良いでしょう。
6
15
 
7
16
  Re: lazex さん