Skip to content

Commit

Permalink
lib: bind functions on EventEmitter
Browse files Browse the repository at this point in the history
  • Loading branch information
himself65 committed Apr 28, 2019
1 parent 5ab65cf commit 601ee1f
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 1 deletion.
19 changes: 19 additions & 0 deletions lib/events.js
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,9 @@ function _addListener(target, type, listener, prepend) {
return target;
}

bindEventEmitterFunction('addListener', '_addListener');
bindEventEmitterFunction('on', '_addListener');

EventEmitter.prototype.addListener = function addListener(type, listener) {
return _addListener(this, type, listener, false);
};
Expand Down Expand Up @@ -308,6 +311,9 @@ EventEmitter.prototype.prependOnceListener =
return this;
};

bindEventEmitterFunction('removeListener', '_removeListener');
bindEventEmitterFunction('off', '_removeListener');

// Emits a 'removeListener' event if and only if the listener was removed.
EventEmitter.prototype.removeListener =
function removeListener(type, listener) {
Expand Down Expand Up @@ -508,3 +514,16 @@ function once(emitter, name) {
emitter.once(name, eventListener);
});
}

function bindEventEmitterFunction(name, target) {
Object.defineProperty(EventEmitter.prototype, name, {
configurable: true,
enumerable: true,
set: function(newVal) {
this[target] = newVal;
},
get: function() {
return this[target];
}
});
}
43 changes: 43 additions & 0 deletions test/parallel/test-event-emitter-check-bind-functions.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
'use strict';
require('../common');
const assert = require('assert');
const events = require('events');

{
const E = events.EventEmitter.prototype;

assert.strictEqual(E.on, E.addListener);
assert.strictEqual(E.off, E.removeListener);

E.on = function() {};
assert.strictEqual(E.on, E.addListener);

E.addListener = function() {};
assert.strictEqual(E.on, E.addListener);

E.off = function() {};
assert.strictEqual(E.off, E.removeListener);

E.removeListener = function() {};
assert.strictEqual(E.off, E.removeListener);
}

{
const EventEmitter = events.EventEmitter;

const ee = new EventEmitter();

assert.strictEqual(ee.on, ee.addListener);

ee.on = function() {};
assert.strictEqual(ee.on, ee.addListener);

ee.addListener = function() {};
assert.strictEqual(ee.on, ee.addListener);

ee.off = function() {};
assert.strictEqual(ee.off, ee.removeListener);

ee.removeListener = function() {};
assert.strictEqual(ee.off, ee.removeListener);
}
4 changes: 3 additions & 1 deletion test/parallel/test-event-emitter-method-names.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,9 @@ assert.strictEqual(E.constructor.name, 'EventEmitter');
assert.strictEqual(E.on, E.addListener); // Same method.
assert.strictEqual(E.off, E.removeListener); // Same method.
Object.getOwnPropertyNames(E).forEach(function(name) {
if (name === 'constructor' || name === 'on' || name === 'off') return;
if (name === 'constructor' || name === 'on' || name === 'off' ||
name === '_addListener' || name === '_removeListener')
return;
if (typeof E[name] !== 'function') return;
assert.strictEqual(E[name].name, name);
});

0 comments on commit 601ee1f

Please sign in to comment.