Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JS中的每个对象都有toString()方法吗?_Javascript_Node.js_Express - Fatal编程技术网

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()
。。我添加了另一张图片,希望它能帮助您更清楚地了解。