Edit in JSFiddle

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);