【问题标题】:Does every object in JS have a toString() method?JS 中的每个对象都有一个 toString() 方法吗?
【发布时间】:2013-09-05 15:49:00
【问题描述】:

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

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

快速配置:

app.use(express.bodyParser())

感谢您的 cmets,现在我发现 req.bodyundefined,但新问题是如何使 toString 再次工作?我希望req.body.toString() 返回字符串如下:

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

我试过delete未定义的toString,不行。见:

【问题讨论】:

  • 该方法可能已被删除。看看这个:var foo = {}; foo.ToString(); foo.toString = undefined; foo.toString();。运行它,看看会发生什么。
  • 您能否展开__proto__ 属性并上传另一个屏幕截图?
  • 您对delete 的附录有点牵强附会。在您的示例中,a 从来没有自己的 toString 方法;它总是从它的原型继承而来。因此,delete 无效,因为a 没有toString 方法(即,`a.hasOwnProperty("toString") 为 false)。
  • 原来解决方案不在Object 原型中,而可能在于直接在实例本身上的自定义toString。您能否显示req.body.toString(没有括号可以调用它——我想查看函数代码的控制台渲染)。
  • 如果在您的实例上直接定义了toString 值,delete 实际上就是这里的答案。您的原型的 toString 函数被实例本身的另一个值“遮蔽”了。通过执行delete req.body.toString,您可以消除undefined 的值并让原型的toString 发光。如果您想在没有 deleteing 实例 toString 的情况下调用它,也可以使用 Object.prototype.toString.call(req.body)

标签: javascript node.js express


【解决方案1】:

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)

【讨论】:

  • toString() 的结果也可能因环境而异,因此即使它存在,也请记住它的输出对于某些功能可能不可靠。
  • +1,但请注意这里的 req.body 似乎有一个 Object 原型,因此在 OP 的特定情况下可能会发生更多情况。也许这个对象将其toString 委托给非Object-原型对象?
  • @apsillers:是的,这也是我的怀疑。也许请求主体的(自定义)toString 方法确实尝试在其他对象上调用 toString()...
  • 我又加了一张图,希望能帮助更清楚。
猜你喜欢
  • 2015-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 2020-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多