有没有办法定义删除事件处理程序函数,就像定义属性获取器和资源库一样?



我正在编写一个公开名为valueChanged的事件的类。我目前正在这样做:

this.valueChanged = undefined;
this.valueChangedListeners = [];
Object.defineProperty(this, "valueChanged", {
set: function(v) {
if (!(v instanceof Function)) {
throw new Error("Invalid value provided for Asset.valueChanged.");
}
// add to the listeners
this.valueChangedListeners.push(v);
}
});

现在,要删除事件侦听器,我有三个选择:

  1. 我可以添加一个名为RemoveValueChangedEventListener的新接口。或

  2. 我可以删除valueChanged属性并将其替换为一组对称的addValueChangedEventListenerremoveValueChangedEventListener方法。或

  3. 我可以遵守EventTarget界面并保留一组事件。因此,我只有两个名为addEventListenerremoveEventListener的对称方法,然后客户端可以为valueChanged事件添加一个事件处理程序,如下所示:


var asset = new Asset("Goodwill",  // asset name
fixedAssets, // asset group
120000);  // value
asset.addEventListener("valueChanged", function(event) {
...
});

但是,我想知道是否已经有一个像addremove这样的关键字来添加和删除事件侦听器,就像定义属性获取者和设置器一样。就像 C# 具有用于向委托添加和删除方法的addremove语法糖一样?

否,没有任何关键字可以添加和删除事件侦听器。 @CertainPerformance对这个问题的评论似乎表明了这一点。他建议我使用属性获取者和设置器来添加和删除事件,但这对我来说没有意义。

因此,最整洁的方法可能是使用对称EventTarget式界面。

Asset.prototype.addEventListener = function(eventName, listener) {
if (eventName !== "valueChanged") {
return false;
}
if (!(listener instanceof Function)) {
throw new Error("Invalid value provided for Asset.valueChanged event listener. Function expected.");
}
// add to the listeners
this.valueChangedListeners.push(listener);
});
Asset.prototype.removeEventListener = function(eventName, listener) {
if (eventName !== "valueChanged") {
return false;
}
if (!(listener instanceof Function)) {
throw new Error("Invalid value provided for Asset.valueChanged event listener. Function expected.");
}
if (!(listener of this.valueChangedListeners)) {
return;
}
for(let i = 0; i < this.valueChangedListeners.length; i++) {
if (this.valueChangedListeners[i] === listener) {
this.valueChangedListeners.splice(i, 1);
return;
}
}
};

最新更新