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(); // エラー
オブジェクトを連想配列の代わりとして使うなら、これを利用するのが良いと思う。