我正在编写一个公开名为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);
}
});
现在,要删除事件侦听器,我有三个选择:
我可以添加一个名为
RemoveValueChangedEventListener
的新接口。或我可以删除
valueChanged
属性并将其替换为一组对称的addValueChangedEventListener
和removeValueChangedEventListener
方法。或我可以遵守
EventTarget
界面并保留一组事件。因此,我只有两个名为addEventListener
和removeEventListener
的对称方法,然后客户端可以为valueChanged
事件添加一个事件处理程序,如下所示:
var asset = new Asset("Goodwill", // asset name
fixedAssets, // asset group
120000); // value
asset.addEventListener("valueChanged", function(event) {
...
});
但是,我想知道是否已经有一个像add
和remove
这样的关键字来添加和删除事件侦听器,就像定义属性获取者和设置器一样。就像 C# 具有用于向委托添加和删除方法的add
和remove
语法糖一样?
否,没有任何关键字可以添加和删除事件侦听器。 @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;
}
}
};