var model = { title: 'this is model.title' }; function observer(changes){ changes.forEach(function(change, i){ console.log("[change " + i + "]"); console.log(change.name); // 変更があったpropertyの名前 console.log(change.type); // 変更の種類 }); } // hogeプロパティを設定する Object.defineProperty(model, 'hoge', { set: function(v) { // カスタム通知 Object.getNotifier(this).notify({ type: 'tekitou', name: 'hoge', oldValue: this.title }); // change.type = updateもnotifyされちゃう this.title = v; }, get: function() { // カスタム通知 Object.getNotifier(this).notify({ type: 'fugafuga', name: 'hoge', oldValue: this.title }); return this.title; } }); // observe登録 Object.observe(model, observer, ['add', 'update', 'tekitou', 'fugafuga', 'aiueo']); // getが呼ばれる var old_title = model.hoge; console.log(old_title); // setが呼ばれる model.hoge = 'new title!!'; // 再度getが呼ばれる var new_title = model.hoge; console.log(new_title);