Skip to content

Commit

Permalink
console: bind methods from the prototype chain in Console
Browse files Browse the repository at this point in the history
In 62232361 we made the console.Console function construct an object
with methods from Console.prototype bound to the instance, instead of
with methods found on the prototype chain to be bound on the instances,
thus breaking users overriding these methods when subclassing Console
because they are not expecting this function to construct a
namespace whose methods are not looked up from the prototype
chain.

This patch restores the previous behavior since it does not affect
the characteristics of the global console anyway. So after this patch,
the Console function still constructs normal objects with function
properties looked up from the prototype chain but bound to the
instances always.

PR-URL: nodejs#24047
Reviewed-By: John-David Dalton <john.david.dalton@gmail.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
  • Loading branch information
joyeecheung authored and Trott committed Nov 6, 2018
1 parent c3b674c commit 04a291a
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 1 deletion.
5 changes: 4 additions & 1 deletion lib/console.js
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,10 @@ function Console(options /* or: stdout, stderr, ignoreErrors = true */) {
var keys = Object.keys(Console.prototype);
for (var v = 0; v < keys.length; v++) {
var k = keys[v];
this[k] = Console.prototype[k].bind(this);
// We have to bind the methods grabbed from the instance instead of from
// the prototype so that users extending the Console can override them
// from the prototype chain of the subclass.
this[k] = this[k].bind(this);
}
}

Expand Down
6 changes: 6 additions & 0 deletions test/parallel/test-console-instance.js
Original file line number Diff line number Diff line change
Expand Up @@ -105,10 +105,16 @@ out.write = err.write = (d) => {};
{
class MyConsole extends Console {
hello() {}
// See if the methods on Console.prototype are overridable.
log() { return 'overridden'; }
}
const myConsole = new MyConsole(process.stdout);
assert.strictEqual(typeof myConsole.hello, 'function');
assert.ok(myConsole instanceof Console);
assert.strictEqual(myConsole.log(), 'overridden');

const log = myConsole.log;
assert.strictEqual(log(), 'overridden');
}

// Instance that does not ignore the stream errors.
Expand Down

0 comments on commit 04a291a

Please sign in to comment.