您必须覆盖 EventTarget.prototype.addEventListener 以构建用于记录所有“添加侦听器”调用的陷阱函数。像这样的东西:
var _listeners = [];
EventTarget.prototype.addEventListenerBase = EventTarget.prototype.addEventListener;
EventTarget.prototype.addEventListener = function(type, listener)
{
    _listeners.push({target: this, type: type, listener: listener});
    this.addEventListenerBase(type, listener);
};
然后你可以构建一个 EventTarget.prototype.removeEventListener s:
EventTarget.prototype.removeEventListeners = function(targetType)
{
    for(var index = 0; index != _listeners.length; index++)
    {
        var item = _listeners[index];
        var target = item.target;
        var type = item.type;
        var listener = item.listener;
        if(target == this && type == targetType)
        {
            this.removeEventListener(type, listener);
        }
    }
}
在 ES6 中,您可以使用 Symbol,直接在实例化对象 self 中隐藏原始函数和所有添加的侦听器列表。
(function()
{
    let target = EventTarget.prototype;
    let functionName = 'addEventListener';
    let func = target[functionName];
    let symbolHidden = Symbol('hidden');
    function hidden(instance)
    {
        if(instance[symbolHidden] === undefined)
        {
            let area = {};
            instance[symbolHidden] = area;
            return area;
        }
        return instance[symbolHidden];
    }
    function listenersFrom(instance)
    {
        let area = hidden(instance);
        if(!area.listeners) { area.listeners = []; }
        return area.listeners;
    }
    target[functionName] = function(type, listener)
    {
        let listeners = listenersFrom(this);
        listeners.push({ type, listener });
        func.apply(this, [type, listener]);
    };
    target['removeEventListeners'] = function(targetType)
    {
        let self = this;
        let listeners = listenersFrom(this);
        let removed = [];
        listeners.forEach(item =>
        {
            let type = item.type;
            let listener = item.listener;
            if(type == targetType)
            {
                self.removeEventListener(type, listener);
            }
        });
    };
})();
你可以用这个小狙击手测试这段代码:
document.addEventListener("DOMContentLoaded", event => { console.log('event 1'); });
document.addEventListener("DOMContentLoaded", event => { console.log('event 2'); });
document.addEventListener("click", event => { console.log('click event'); });
document.dispatchEvent(new Event('DOMContentLoaded'));
document.removeEventListeners('DOMContentLoaded');
document.dispatchEvent(new Event('DOMContentLoaded'));
// click event still works, just do a click in the browser