每次更改对象属性时,是否可以使用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;
答案 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");
}
});