有没有一种方法可以像定义属性getter和setter一样定义remove eventhandler函数?

时间:2018-10-16 06:48:17

标签: javascript

我正在编写一个公开名为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这样的关键字可以设置来添加和删除事件侦听器,就像定义属性getter和setter一样。就像C#具有addremove语法糖来向委托添加和删除方法一样?

1 个答案:

答案 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;
        }
    }
};