使用setter在更改object属性时调度事件

时间:2016-06-17 17:44:06

标签: javascript

每次更改对象属性时,是否可以使用setter / getter来调度事件?通过更改,我的意思是成员添加,删除或更新。

以下是我想要实现的非工作示例。每次将成员添加到instance._dataStore时,instance都应触发事件。

var EventDispatcherObject = require("EventDispatcherObject");

var instance = new EventDispatcherObject();

//This is a non-working attempt to use setter to dispatch event
Object.defineProperty(instance, "_dataStore", {
          get : function() {
                    return this_dataStore;
          },
          set : function(data) {
                    this._dataStore[data] = data;
                    this.dispatchEvent("_dataStoreChanged");
          }
});


var data = [{id: "A", data: "abc"}, {id: "B", data: "def"}, {id: "C", data: "ghi"}];

for (var i=0; i < data.length; i++ ) {
    instance._dataStore[data[i].id] = data[i];
}

//should return:
console.log(instance._dataStore);
>>> {
      A : {id: "A", data: "abc"}, 
      B : {id: "B", data: "def"}, 
      C : {id: "C", data: "ghi"}
    }
console.log(instance._dataStore[A]);
>>> {id: "A", data "abc"}

实际上这个非工作示例返回错误:

InternalError: too much recursion: return this._dataStore;

1 个答案:

答案 0 :(得分:2)

您的setter是为_dataStore属性定义的,而不是为_dataStore属性的属性定义的。因此,只有在您指定_dataStore时才会触发。

您应该使用Proxy进行调查;它允许你挂钩任何 setter,而普通的setter只适用于特定的属性。

this._backingData = {};
this._dataStore = new Proxy(this._backingData, {
  set(target, prop, value, receiver) {
    target[prop] = value;
    this.dispatchEvent("_dataStoreChanged");        
  }
});