Permalink
Browse files

util: custom `inspect()` method may return an Object

This is more like how `JSON.stringify()` works.
Closes #2711.
  • Loading branch information...
1 parent 43c1830 commit 62b7ae82bb2b5af9d1d79c7fde6352927834d1a3 @TooTallNate committed Jan 30, 2013
Showing with 24 additions and 1 deletion.
  1. +14 −0 doc/api/util.markdown
  2. +5 −1 lib/util.js
  3. +5 −0 test/simple/test-util-inspect.js
View
@@ -114,6 +114,8 @@ Predefined color codes are: `white`, `grey`, `black`, `blue`, `cyan`,
`green`, `magenta`, `red` and `yellow`.
There are also `bold`, `italic`, `underline` and `inverse` codes.
+### Custom `inpect()` function on Objects
+
Objects also may define their own `inspect(depth)` function which `util.inspect()`
will invoke and use the result of when inspecting the object:
@@ -127,6 +129,18 @@ will invoke and use the result of when inspecting the object:
util.inspect(obj);
// "{nate}"
+You may also return another Object entirely, and the returned String will be
+formatted according to the returned Object. This is similar to how
+`JSON.stringify()` works:
+
+ var obj = { foo: 'this will not show up in the inspect() output' };
+ obj.inspect = function(depth) {
+ return { bar: 'baz' };
+ };
+
+ util.inspect(obj);
+ // "{ bar: 'baz' }"
+
## util.isArray(object)
View
@@ -209,7 +209,11 @@ function formatValue(ctx, value, recurseTimes) {
value.inspect !== exports.inspect &&
// Also filter out any prototype objects using the circular check.
!(value.constructor && value.constructor.prototype === value)) {
- return String(value.inspect(recurseTimes));
+ var ret = value.inspect(recurseTimes);
+ if ('string' !== typeof ret) {
+ ret = formatValue(ctx, ret, recurseTimes);
+ }
+ return ret;
}
// Primitive types cannot have properties
@@ -155,3 +155,8 @@ assert(util.inspect(subject, { customInspect: true }).indexOf('123') !== -1);
assert(util.inspect(subject, { customInspect: true }).indexOf('inspect') === -1);
assert(util.inspect(subject, { customInspect: false }).indexOf('123') === -1);
assert(util.inspect(subject, { customInspect: false }).indexOf('inspect') !== -1);
+
+// custom inspect() functions should be able to return other Objects
+subject.inspect = function() { return { foo: 'bar' }; };
+
+assert.equal(util.inspect(subject), '{ foo: \'bar\' }');

0 comments on commit 62b7ae8

Please sign in to comment.