我正在编写一个公开名为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
这样的关键字可以设置来添加和删除事件侦听器,就像定义属性getter和setter一样。就像C#具有add
和remove
语法糖来向委托添加和删除方法一样?
答案 0 :(得分:0)
否,没有要添加和删除事件侦听器的关键字。 @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;
}
}
};