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(){}())の即時関数内に閉じ込めておけば、外部からアクセス不能になるわけで、立派にプライベートな状態でしょ。