diff --git a/lib/events.js b/lib/events.js index 50cc720b124..e8fd3bbb792 100644 --- a/lib/events.js +++ b/lib/events.js @@ -276,6 +276,12 @@ ObjectDefineProperty(EventEmitter, 'defaultMaxListeners', { }, }); +function hasEventListener(self, type) { + if (type === undefined) + return self._events !== undefined; + return self._events !== undefined && self._events[type] !== undefined; +}; + ObjectDefineProperties(EventEmitter, { kMaxEventTargetListeners: { __proto__: null, @@ -669,13 +675,11 @@ EventEmitter.prototype.removeListener = function removeListener(type, listener) { checkListener(listener); - const events = this._events; - if (events === undefined) + if (!hasEventListener(this, type)) return this; + const events = this._events; const list = events[type]; - if (list === undefined) - return this; if (list === listener || list.listener === listener) { this._eventsCount -= 1; @@ -729,9 +733,9 @@ EventEmitter.prototype.off = EventEmitter.prototype.removeListener; */ EventEmitter.prototype.removeAllListeners = function removeAllListeners(type) { - const events = this._events; - if (events === undefined) + if (!hasEventListener(this)) return this; + const events = this._events; // Not listening for removeListener, no need to emit if (events.removeListener === undefined) { @@ -776,14 +780,10 @@ EventEmitter.prototype.removeAllListeners = }; function _listeners(target, type, unwrap) { - const events = target._events; - - if (events === undefined) + if (!hasEventListener(target, type)) return []; - const evlistener = events[type]; - if (evlistener === undefined) - return []; + const evlistener = target._events[type]; if (typeof evlistener === 'function') return unwrap ? [evlistener.listener || evlistener] : [evlistener];