ECMAScript 6 規定の WeakMap を利用して private method を作る

0
JSer @Hikaru_oao

はてなブログに投稿しました Class構文が実装された - JS.next js-next.hatenablog.com/entry/2014/11/…

2014-11-01 03:46:20
think49 @think49

#ES6 で Class が定義されるらしい。「これで待望の private method が使える!」と思ったが、見つからなかった。おかしい…。/ Class構文が実装された - JS.next js-next.hatenablog.com/entry/2014/11/…

2014-11-02 01:39:56
think49 @think49

@think49 people.mozilla.org/~jorendorff/es… を private で検索したら ReservedWord に入ってた。private method は #ES7 までおあずけ…?

2014-11-02 01:43:25
小倉唯 @Constellation

private method, symbol 使えばなんとかなる

2014-11-02 01:44:34
think49 @think49

@Constellation アドバイス感謝です。確かに new Symbol('private-method') を関数スコープ内に閉じ込めれば private method になりますね。 jsfiddle.net/7xL0grf8/ #ES6 #JavaScript

2014-11-02 02:18:39
think49 @think49

@Constellation 今まで出来なかったことが出来るようになるのは嬉しいのですが、やっぱり、Class構文で実現したかったですねー。

2014-11-02 02:24:41
小倉唯 @Constellation

@think49 class の構文の一部というわけではないですが, 名前事前に用意して, [privateMethod](...) { } という形で class の中で定義してはどうですか?

2014-11-02 02:28:14
think49 @think49

@Constellation なるほど。何にしてもprivateにする為には関数スコープで閉じ込める必要がありますね。ECMAScriptらしいとは思うのですが、classを使うことで関数スコープで閉じ込める手間が減ってくれる事を期待していました。

2014-11-02 02:41:50
think49 @think49

@think49 @Constellation jsfiddle.net/7xL0grf8/1/ ならスコープは増やさなくて済みますが、prototype method と共有できないなあ、と。

2014-11-02 02:43:13
think49 @think49

people.mozilla.org/~jorendorff/es… ReservedWord に "private", "protected", "public" があるので #ES7 に期待しよう!

2014-11-02 02:57:05
JSer @Hikaru_oao

@think49 Symbolキーはやろうと思えば列挙できるので、privateとはちょっと違います。 ES6的にprivateプロパティを実現させたい時はWeakMapを使います。

2014-11-02 03:37:21
JSer @Hikaru_oao

@think49 ES7でのprivateの方向性は今月のTC39 meeting以降決まってくると思いますが、新たな仕組みというよりは、WeakMap的なものでの糖衣構文になる可能性が高い気がします。

2014-11-02 03:37:37
think49 @think49

@Hikaru_oao Object.getOwnPropertySymbols を使えば Symbol なプロパティを取得できてしまうので厳密には private ではないんですね…。 people.mozilla.org/~jorendorff/es… #ES6 #JavaScript

2014-11-02 09:36:49
think49 @think49

@Hikaru_oao あまり自信はないのですが、WeakMap による実装例は jsfiddle.net/7xL0grf8/5/ のような感じでしょうか。 #ES6 #JavaScript

2014-11-02 10:12:31
think49 @think49

#ES3 の Function.prototype.call を使うコードとよく似てる。 jsfiddle.net/7xL0grf8/6/ #JavaScript

2014-11-02 10:20:36
think49 @think49

private method を呼び出す度に Function#call を使うコードは美しくない。そうだ、bind を使おう。 jsfiddle.net/7xL0grf8/7/ #JavaScript #ES5

2014-11-02 10:27:34
think49 @think49

WeakMap, Function#bind を併用した private method なコード。 jsfiddle.net/7xL0grf8/10/ #ES5 #ES6 #JavaScript

2014-11-02 10:37:36
think49 @think49

@Hikaru_oao 今までのコードに違和感を感じていた原因がはっきりしました。WeakMap はこう使うんですね(GC36 で期待通りに動作しました)。 jsfiddle.net/7xL0grf8/11/ #ES6 #JavaScript

2014-11-02 10:47:31
think49 @think49

var prototype; を削除しわすれた…。

2014-11-02 10:49:36
JSer @Hikaru_oao

@think49 メソッドに関してはやはりメソッドでなくてクロージャ内に普通の関数として用意するというのが一番無難だと思います。 プロパティであれば比較的簡単にWeakMapを使ってプライベートなものが実現できます。 jsfiddle.net/445Ltm83/1/

2014-11-02 15:11:28
think49 @think49

@Hikaru_oao ありがとうございます。まだ、コード理解が追いついてないので読み進めていこうと思います。

2014-11-03 12:24:21