WeakMap を使ったプライベートな値
見えてきた「ECMAScript 6」。JavaScriptの生みの親が書く「Harmony of Dreams Come True」 − Publickey で WeakMap の紹介があったことだし、ちょっと使えそうなネタでも書いておくよ。
WeakMapを使って、インスタンス毎にプライベートな値を持てるようにしようという試み。まぁよくあるネタだから、二番煎じ、三番煎じになってそうだけど。
var FooClass = (function (){ var wmap = new WeakMap; function Foo (name) { wmap.set(this, {}); this.privateName = name; } Foo.prototype = { get privateName() { return wmap.get(this).name; }, set privateName(val) { return wmap.get(this).name = val; }, } return Foo; }()); var f1 = new FooClass("FOO"); var f2 = new FooClass("HOGE"); console.log(f1.privateName); // => "FOO" console.log(f2.privateName); // => "HOGE"
Fooコンストラクタ内で自身のオブジェクトをキーとして空オブジェクトを登録しておいて、後はインスタンスのメソッド等からthisを使えばアクセスすれば良いよねって感じ。
WeakMapのオブジェクトは(function(){}())の即時関数内に閉じ込めておけば、外部からアクセス不能になるわけで、立派にプライベートな状態でしょ。