是否可以覆盖 JavaScript 的 toString() 函数来为调试提供有意义的输出?

IT技术 javascript debugging tostring
2021-01-29 14:32:26

当我console.log()在 JavaScript 程序中创建一个对象时,我只看到输出[object Object],这对于确定它是什么对象(甚至是什么类型的对象)并不是很有帮助。

在 C# 中,我习惯于重写ToString()以便能够自定义对象的调试器表示。我可以在 JavaScript 中做类似的事情吗?

6个回答

您也可以toString在 Javascript 中进行覆盖见示例:

function Foo() {}

// toString override added to prototype of Foo class
Foo.prototype.toString = function() {
  return "[object Foo]";
}

var f = new Foo();
console.log("" + f); // console displays [object Foo]

对如何在JavaScript中确定对象类型名称的讨论。

'Object.prototype.toString.call(f) 仍将显示 [object Object]。' 是的,因为这是一个与 'Foo.prototype.toString' 完全不同的函数,哈哈。
2021-04-08 14:32:26
如果像我这样的其他人最终出现在这里,您可以使用 ES6 中的 Sybmol.toStringTag 来自定义 Object.prototype.toString.call 行为。developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
2021-04-10 14:32:26
虽然它是真的,但警报函数将显示覆盖原型toString属性的函数的返回值,但Object.prototype.toString.call(f)仍将显示[object Object].
2021-04-11 14:32:26

首先覆盖toString您的对象或原型:

var Foo = function(){};
Foo.prototype.toString = function(){return 'Pity the Foo';};

var foo = new Foo();

然后转换为字符串,查看对象的字符串表示:

//using JS implicit type conversion
console.log('' + foo);

如果您不喜欢额外的输入,您可以创建一个函数,将其参数的字符串表示形式记录到控制台:

var puts = function(){
    var strings = Array.prototype.map.call(arguments, function(obj){
        return '' + obj;
    });
    console.log.apply(console, strings);
};

用法:

puts(foo)  //logs 'Pity the Foo'

puts(foo, [1,2,3], {a: 2}) //logs 'Pity the Foo 1,2,3 [object Object]'

更新

E2015 为这些东西提供了更好的语法,但你必须使用像Babel这样的转译器

// override `toString`
class Foo {
  toString(){
    return 'Pity the Foo';
  }
}

const foo = new Foo();

// utility function for printing objects using their `toString` methods
const puts = (...any) => console.log(...any.map(String));

puts(foo); // logs 'Pity the Foo'
console.log('' + foo); 这是我没有看到任何 toString 实现的问题,直到我得到你的答案。
2021-03-25 14:32:26

如果您使用的是 Node,则可能值得考虑util.inspect

var util = require('util')

const Point = {
  x: 1,
  y: 2,
  [util.inspect.custom]: function(depth) { return `{ #Point ${this.x},${this.y} }` }

}

console.log( Point );

这将产生:

{ #Point 1,2 }

而没有检查打印的版本:

{ x: 1, y: 2 }

更多信息(+classes 中使用的示例):

https://nodejs.org/api/util.html#util_util_inspect_custom

在浏览器 JS 中获得可调试输出的一种简单方法是将对象序列化为 JSON。所以你可以像这样打电话

console.log ("Blah: " + JSON.stringify(object));

例如,alert("Blah! " + JSON.stringify({key: "value"}));生成带有文本的警报Blah! {"key":"value"}

请注意循环引用和函数。
2021-03-21 14:32:26
@dev 方便,但不会覆盖 toString()。
2021-03-29 14:32:26
这很方便。我想象的输出可能有点大,但在紧要关头工作!
2021-04-04 14:32:26

使用模板文字

class Foo {
  toString() {
     return 'I am foo';
  }
}

const foo = new Foo();
console.log(`${foo}`); // 'I am foo'