Is There A Method I Can Override On A Javascript Object To Control What Is Displayed By Console.log?
Solution 1:
There's no way I know of. Your best bet will be to define a toString()
method on the object you want to log and then call it, either directly or indirectly:
var o = {};
o.toString = function() {
return"Three blind mice";
};
console.log("" + o);
console.log(o.toString());
Solution 2:
Just for future readers, there is now a way to do exactly what is asked here.
For the solution please read this duplicated post:
Solution 3:
You can do this in Chrome nowadays with a devtools custom formatter. They don't seem to be officially documented anywhere, and aren't enabled by default -- so you have to enable them in (Dev Tools Settings) > Console > Enable Custom Formatters. But then you can add a custom formatter for your object:
classCustomClass {
constructor (foo, bar) { this.foo = foo; this.bar = bar; }
}
window.devtoolsFormatters = (window.devtoolsFormatters || []).concat([{
header: (obj) => {
if (obj instanceofCustomClass) {
return ['div', {}, `CustomClass(${obj.foo}, ${obj.bar})`];
} else {
returnnull; // fall back to default formatter
}
},
hasBody: () =>true, // if the user can expand to get more infobody: (obj) => {
return ['div', {},
['span', {style: 'display: block; font-weight: bold'}, 'CustomClass'],
['span', {style: 'display: block; margin-left: 2em'}, `foo: ${obj.foo}`],
['span', {style: 'display: block; margin-left: 2em'}, `bar: ${obj.bar}`],
];
}
}]);
A few words of warning:
- You must return a JsonML ([tag-name, attrs, children...]) list from the formatter. If you return an invalid JsonML or a bare string, it will either fail silently or throw an error.
- The formatter must have a header() and hasBody() function, and if hasBody() returns true, must have a body() function as well. Otherwise your formatter will be either silently ignored or throw an error.
- A lot of element types aren't supported. I was only able to get
div
andspan
to work;p
,strong
, and other elements all failed. But you can emulate them with CSS. - The
window.devtoolsFormatters
array is null by default, but I added the check because extensions may already add their own custom formatters.
You can find a bit more information here: https://docs.google.com/document/d/1FTascZXT9cxfetuPRT2eXPQKXui4nWFivUnS_335T3U/preview
Solution 4:
You should get a better result from Firebug, you should get
var a = function(){};
console.log(a); // output: functiona.toString = function(){ return'a'; };
console.log(a); // output: function, {toString()}
a.valueOf = function(){ return'v'; };
console.log(a); // output: function, {toString(), valueOf()}
Post a Comment for "Is There A Method I Can Override On A Javascript Object To Control What Is Displayed By Console.log?"