JS中的每个对象都有一个toString()方法吗?

时间:2013-09-05 15:49:00

标签: javascript node.js express

enter image description here

enter image description here

如果这是真的,为什么会发生这种错误?如图所示,req.body对象不是nullundefined

我使用node-inspector调试我的express.js应用,这张照片是在Chrome Developer Tools中拍摄的。

快速配置:

app.use(express.bodyParser())

感谢您的评论,现在我发现req.bodyundefined,但新问题是如何让toString再次发挥作用?我希望req.body.toString()返回字符串,如下所示:

enter image description here

如何重新签署正确的toString方法?

我尝试了delete未定义的toString,没有好处。参见:

enter image description here

1 个答案:

答案 0 :(得分:15)

  

JS中的每个对象都有一个toString()方法吗?

没有。只有那些从Object.prototype继承它(就像所有普通对象一样)或者自己定义它(或者从它们的自定义原型继承它)的那些做。

您可以Object.create(null)创建此类异常对象。您还可以为普通对​​象提供一个自己的toString属性,该属性可以隐藏继承的属性,而不是一个函数(例如{toString:0}),但我想这会产生明显的错误。

在您的情况下,似乎bodyParser()使用的querystring parser确实(确实)创建了没有原型的对象,以避免在使用这些参数时损坏.constructor.prototype。请参阅qs pullrequest #58express issue 1636: Bodyparser not setting object.prototype?(建议更新)。

  

如何重新分配正确的toString方法?

您可以分配任何功能,例如

req.body.toString = function() { return "Hi, I'm a request body"; };

但可能你想要标准的那个:

req.body.toString = Object.prototype.toString;

其他选项是通过非标准__proto__属性(req.body.__proto__ = Object.prototype)重新定义原型,或者只是在对象上应用独立函数而不是使其成为方法,如Object.prototype.toString.call(req.body)