スマートフォン用の表示で見る生涯未熟プログラミングをちょこちょこと。2016-08-09JavaScriptのクラスでprivateを実現してみたかった人生だったというわけでJavaScirptのクラス内にprivateメソッドやらprivateプロパティやらを実現したいな、と思って調べた時に色々知ることがあったのでまとめてみる。調べてみると4つほど方法がありました。privateメソッド・プロパティの接頭辞に_を付けるクロージャを使った実装Symbolを使うWeakMapを使うそれぞれについてうんうんと考えてみましょう。privateメソッド・プロパティの接頭辞に_を付けるこれは超簡単ですね。プライベートメソッドなのに呼べちゃうこれはただの紳士協定で、「プライベートメソッドは接頭辞にアンダースコアを付けるので外から呼ばないでね」って感じのものです。クロージャを使った実装これはこちらの記事にとても詳しく書いてあります。(@jun1s様に感謝)sites.google.comメモリ消費の観点から現実的では無い模様。Symbolを使うSymbolはES6で新たに追加されたプリミティブなデータ型ですね。これを使って果たしてprivateを実現できるのでしょうか。Hoge()hoge.setFoo()console.log(hoge.getFoo())hoge.setBar()console.log(hoge.getBar())これでHogeクラスにprivateプロパティ・メソッドが実現できました。Symbolを使った方法は1点問題があり、そもそもprivateじゃないという問題点があります。設定した値を外から取得する方法があります。使うとSymbolが取得できてしまうというもの。[]参考:qiita.comというわけでSymbolを用いた方法もちょっと違うかなと。[追記]@gaogao_9さんからアドバイスを頂けました。*/}}みたいな動的プロパティ指定が出来ますのでこれでprivateメソッドを簡潔に書けますよ。2016ご教授頂いたコードがこちら。'foo'console.log(hoge.foo)console.log(hoge.bar())こちらの方が見やすいですね!WeakMapを使うWeakMapというMapのキーにオブジェクトが使える方法があるので、それを使ってprivateを実現する。Hoge()hoge.setFoo()console.log(hoge.getFoo())hoge.setBar()console.log(hoge.getBar())WeakMapでclassをセットして、そこにprivateプロパティなりメソッドなりをセットするような感じ。実行部は別にするので大丈夫。まとめなんとなーく薄い理解ですが、WeakMapを使えばprivateが実現できますが深いことを考えなければSymbolでもいいのかなと。深いことを考えなければアンダースコア使っちゃってもいいのかなと。この辺りは実装者によってだいぶ分かれそうですね。なんかふんわり理解をまとめた感じなので、「これ違うだろ」というツッコミ頂けると喜びます。昨日、gitpomoをリリースしました。(1)はてなブログをはじめよう!syossanさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。