是否可以重写 JavaScript 的 toString() 函数以提供有意义的调试输出?

2022-08-30 04:20:37

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

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


答案 1

您也可以在Javascript中覆盖。请参阅示例:toString

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 中确定对象类型名称。


答案 2

首先覆盖对象或原型: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'