最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Does every object in JS have a toString() method? - Stack Overflow

programmeradmin3浏览0评论

If that is true, why this error happens? The req.body object is not null or undefined as the picture shows.

I use the node-inspector to debug my express.js app, this picture is taken in Chrome Developer Tools.

Express configuration:

app.use(express.bodyParser())

Thanks to your comments, now I found the req.body is undefined, but new question is how to make the toString works again? I want req.body.toString() to return string as below:

How to re-sign a proper toString method?

I tried delete the undefined toString, no good. See:

If that is true, why this error happens? The req.body object is not null or undefined as the picture shows.

I use the node-inspector to debug my express.js app, this picture is taken in Chrome Developer Tools.

Express configuration:

app.use(express.bodyParser())

Thanks to your comments, now I found the req.body is undefined, but new question is how to make the toString works again? I want req.body.toString() to return string as below:

How to re-sign a proper toString method?

I tried delete the undefined toString, no good. See:

Share Improve this question edited Sep 5, 2013 at 16:28 Yad Smood asked Sep 5, 2013 at 15:49 Yad SmoodYad Smood 2,9322 gold badges26 silver badges38 bronze badges 9
  • 2 The method may have been removed. Check this out: var foo = {}; foo.ToString(); foo.toString = undefined; foo.toString();. Run this and see what happens. – Geeky Guy Commented Sep 5, 2013 at 15:51
  • Can you please expand the __proto__ property(ies) and upload another screenshot? – Bergi Commented Sep 5, 2013 at 15:55
  • 1 Your addendum with delete is a bit of a red herring. In your example, a never had its own toString method; it was always inhered from its prototype. Thus, the delete has no effect, because a doesn't have a toString method (i.e., `a.hasOwnProperty("toString") is false). – apsillers Commented Sep 5, 2013 at 15:59
  • 2 Turns out the solution is not in the Object prototype, but probably lies in a custom toString directly on the instance itself. Could you also show req.body.toString (no parens to invoke it -- I want to see the console rendering of the function's code). – apsillers Commented Sep 5, 2013 at 16:06
  • 1 If a toString value is defined directly on your instance, delete is actually the answer here. Your prototype's toString function is "shadowed" by another value on the instance itself. By doing delete req.body.toString you blow away the undefined value and let the prototype's toString shine through. You could also do Object.prototype.toString.call(req.body) if you wanted to invoke it without deleteing the instance toString. – apsillers Commented Sep 5, 2013 at 16:14
 |  Show 4 more comments

1 Answer 1

Reset to default 19

Does every object in JS have a toString() method?

No. Only those that inherit it from Object.prototype (as all normal objects do) or define it on its own (or inherit it from their custom prototype) do.

You can create such unusual objects by Object.create(null). You also could give a plain object an own toString property that shadows the inherited one and is not a function (e.g. {toString:0}), but I guess that would've throw a distinct error.

In your case, it seems that the querystring parser used by bodyParser() does (did) indeed create objects without prototypes, to avoid mangling .constructor.prototype when such parameters were used. See qs pullrequest #58 and express issue 1636: Bodyparser not setting object.prototype? (suggesting an update).

How to reassign a proper toString method?

You could just assign any function, like

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

but probably you want the standard one:

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

Other options would be redefining the prototype via the non-standard __proto__ property (req.body.__proto__ = Object.prototype) or simply applying a standalone function on the object instead of making it a method, like Object.prototype.toString.call(req.body).

发布评论

评论列表(0)

  1. 暂无评论