【问题标题】:adjust console.log behaviour of custom object调整自定义对象的 console.log 行为
【发布时间】:2025-12-28 10:25:12
【问题描述】:

有什么方法可以影响console.log 给出的自定义对象吗? 我试图覆盖 customObject.prototype.toString 方法,但是没有用。

有什么想法吗?

【问题讨论】:

标签: javascript node.js


【解决方案1】:

在 node.js 中,console.log 在每个参数上调用 util.inspect,而没有格式化占位符。因此,如果您在对象上定义 inspect(depth, opts) 方法,它将被调用以获取对象的自定义字符串表示形式。

例如:

function Custom(foo) {
    this.foo = foo;
}

Custom.prototype.inspect = function(depth, opts) {
    return 'foo = ' + this.foo.toUpperCase();
};

var custom = new Custom('bar');
console.log(custom);

输出:

foo = BAR

或者使用一个类:

class Custom {
    constructor(foo) {
        this.foo = foo;
    }

    inspect(depth, opts) {
        return 'foo = ' + this.foo.toUpperCase();
    }
}

var custom = new Custom('bar');
console.log(custom);

【讨论】:

  • 定义一个新的检查方法还有其他重要的含义吗?
  • @Moezalez 我不知道,不。根据文档,util.inspect 的主要用途是用于调试,因此它的使用符合预期。
  • 浏览器中是否有任何等效选项?
  • 这不再适用于 Node v16+,至少。查看其他答案。
【解决方案2】:

之前的答案已在较新版本的节点中被弃用。现在需要实现的方法是符号[util.inspect.custom]

例如:

const util = require('util');

class Custom {
  constructor(foo, bar) {
    this.foo = foo;
    this.bar = bar;
  }

  [util.inspect.custom](depth, opts) {
    return this.foo + this.bar;
  }
}

console.log(new Custom(3, 5)); // Prints '8'

【讨论】:

  • 你能解释一下这个语法吗?我是 JS 新手
  • 如何在浏览器中做到这一点?
  • @JacobWeisenburger 您可以通过为该类创建自己的toString 方法,然后在您console.log 该类时调用该方法,从而在浏览器中实现类似的功能,覆盖日志记录的默认行为不太重要在浏览器中,因为大概您只会在那里进行调试。
  • @tbhaxor 为迟到的回复道歉,但无论如何我都会回复,以防它最终对其他人有用。 [util.inspect.custom] 方法名称是 computed property names 的一个示例,在这种情况下,属性名称是由 util.inspect.custom 引用的 symbol,这样做的主要原因是为了保证其唯一性。
最近更新 更多