Javascript JS中的每个对象都有toString()方法吗?
如果这是真的,为什么会发生这种错误?如图所示,Javascript JS中的每个对象都有toString()方法吗?,javascript,node.js,express,Javascript,Node.js,Express,如果这是真的,为什么会发生这种错误?如图所示,req.body对象不是null或undefined 我使用节点检查器调试我的express.js应用程序,这张照片是在Chrome开发者工具中拍摄的 快速配置: app.use(express.bodyParser()) 感谢您的评论,现在我发现req.body是未定义的,但新的问题是如何使toString再次工作?我希望req.body.toString()返回如下字符串: 如何重新签署适当的toString方法 我尝试了删除未定义的toStr
req.body
对象不是null
或undefined
我使用节点检查器
调试我的express.js
应用程序,这张照片是在Chrome开发者工具
中拍摄的
快速配置:
app.use(express.bodyParser())
感谢您的评论,现在我发现req.body
是未定义的
,但新的问题是如何使toString
再次工作?我希望req.body.toString()
返回如下字符串:
如何重新签署适当的toString
方法
我尝试了删除未定义的toString
,没有效果。见:
JS中的每个对象都有toString()方法吗
不可以。只有那些从对象.prototype继承它(就像所有普通对象一样)或自己定义它(或从自定义原型继承它)的对象才会这样做
您可以通过Object.create(null)
创建这些不寻常的对象。你也可以给一个普通对象一个自己的toString
属性,该属性会隐藏继承的对象,并且不是一个函数(例如{toString:0}
),但我想这会引发一个明显的错误
在您的例子中,似乎bodyParser()
使用的确实创建了没有原型的对象,以避免在使用此类参数时损坏.constructor.prototype
。请参阅和(建议更新)
如何重新分配适当的toString方法
你可以分配任何函数,比如
req.body.toString = function() { return "Hi, I'm a request body"; };
但你可能想要标准的:
req.body.toString = Object.prototype.toString;
其他选项是通过非标准的\uuuuu proto\uuuu
属性(req.body.\uuuuu proto\uuuu=Object.prototype
)重新定义原型,或者简单地在对象上应用一个独立函数,而不是将其作为一个方法,比如对象.prototype.toString.call(req.body)
,该方法可能已被删除。检查一下:var foo={};foo.ToString();foo.toString=未定义;foo.toString()代码>。运行此命令,看看会发生什么。请展开\uuuu proto\uuuu
属性并上载另一个屏幕截图好吗?您的删除
补遗有点让人费解。在您的示例中,a
从来没有自己的toString
方法;它总是源于它的原型。因此,delete
没有效果,因为a
没有toString
方法(即,`a.hasOwnProperty(“toString”)为false)。结果表明,解决方案不在对象
原型中,而可能直接在实例本身上存在一个自定义的toString
。您是否也可以显示req.body.toString
(没有调用它的参数——我想查看函数代码的控制台呈现)。如果直接在您的实例上定义了toString
值,delete
实际上就是这里的答案。原型的toString
函数被实例本身的另一个值“隐藏”。通过执行delete req.body.toString
操作,您可以吹走未定义的值,让原型的toString
发光。如果您想在不删除实例的情况下调用它,您也可以执行Object.prototype.toString.call(req.body)
。toString()的结果也可能因环境而异,因此,即使它存在,也值得记住,它的输出对于某些函数可能不可靠。+1,但请注意,req.body
这里似乎有一个对象
原型,因此在OP的特定情况下可能会有更多的情况发生。也许这个对象将它的toString
委托给了一个非对象
-原型对象?@apsillers:是的,我也怀疑这一点。也许请求主体的(自定义)toString
方法确实尝试在其他对象上调用toString()
。。我添加了另一张图片,希望它能帮助您更清楚地了解。