getterとsetter / Object.create(null)

GetterとSetter

ES 5thからsetterとgetterの定義が仕様に入ったわけですが…

var Hoge = Object.create({}, {
    // プロパティ
    val: { 
        set: function(a){ this._a = a }, 
        get: function(){ return this._a }
    },
    // メソッド
    add: { 
        value: function(a){ this._a += a }
    },
    init: {
        value: function(a){ this.val = a; return this; }
    }
});

Object.createやObject.definePropertiesの第2引数に渡すオブジェクトの形式は厳密に定められいて、プロパティディスクリプタ(Property Descriptor)という偉そうな名前が付けられている。value/set/get以外にconfigurableだとかenumerableとかwritableとかの属性を設定できる。

configurable、enumerable、writableの属性の設定が不要ならば、こんな面倒な書き方をせずとも以下のように書くこともできる。

var Hoge = {
   // プロパティ
   set val(a){ this._a = a }, 
   get val(){ return this._a },
   // メソッド
   add: function(a){ this._a += a },
   init: function(a){ this.val = a; return this; }
};

var h = Object.create(Hoge).init(1);
h.add(4);
console.log("value:" + h.val);   // => value: 5
h.val = 1
h.add(2);
console.log("value:" + h.val);   // => value: 3

Object.create(null)

nullを渡すとtoString、hasOwnProperty等のメソッドやconstructorプロパティすら持ってない、空っぽのオブジェクトを作成できる。

var obj = Object.create(null);
obj.toString();   // エラー

オブジェクトを連想配列の代わりとして使うなら、これを利用するのが良いと思う。