关于node.js:JavaScript toString()似乎没有在NodeJS中自动调用

JavaScript toString() seems not to be called automatically in NodeJS

mozilla.org上的文档指出:"每个对象都有一个toString()方法,当该对象将被表示为文本值或以一种预期的方式引用一个对象时,该方法会自动调用。默认情况下,toString()方法由Object派生的每个对象继承。如果未在自定义对象中重写此方法,则toString()返回" [object type]",..."

听起来合乎逻辑:将调用toString()方法。因此,我定义了自己的"类"并定义了toString()方法:

1
2
3
4
5
6
7
function DataField(name, dataType)  {
    // ....
}

DataField.prototype.toString = function() {
    return this.type.name +"" + this.name;
}

我实例化这样的对象:

1
var dataField = new DataField("myint", DataType.INTEGER);

我尝试在NodeJS中分别输出对象的字符串表示形式:

1
2
3
console.log(dataField);
console.log("" + dataField);
console.log(dataField.toString());

第一个输出与其他输出不同。第一个将给出对象的某种JSON.stringify()表示形式。 toString()不会像我期望的那样被自动调用。第二和第三输出将完全达到我的期望:

1
INTEGER myint

所以我有点困惑。这意味着,尽管mozilla.org的解释表明,toString()不会自动被调用。这是NodeJS中的正常行为,还是我没有正确解释mozilla.org上的解释?

您可能会认为:好吧,那么让我们在必要时明确地调用toString(),一切都很好。但这带来一些不便。如果我创建对象数组并使用console.log()输出该数组,则不会调用toString()。这意味着:生成的输出是无用的。这意味着,如果我将具有toString()的显式实现的对象存储在容器对象的数组中,则必须以非常特定且不方便的方式实现容器对象的toString():我必须编写代码以显式创建一个容器对象本身中包含的任何对象数组的字符串表示形式。当然,我可以这样做,但是我会直觉地假设toString()方法会被自动调用,从而消除了对显式实现的这种需求。

关于NodeJS,在这个特定问题上查找信息似乎并不容易。因此,如果您了解此主题,将对您有所帮助。问题是:创建数据模型(人类可读)字符串表示形式(=包含其他数据对象列表的数据容器对象)的最优雅方法是什么?


在Node.js中,console.log调用util.format,而不调用toString()