2013-09-05 11 views
6

enter image description hereJSのすべてのオブジェクトにtoString()メソッドがありますか?

enter image description here

それが本当であるなら、なぜこのエラーが起こりますか?画像が示すようにreq.bodyオブジェクトはnullまたはundefinedではありません。

私は​​アプリをデバッグするためにnode-inspectorを使用しています。この写真はChrome Developer Toolsに掲載されています。

Expressの設定:あなたのコメントへ

app.use(express.bodyParser())

おかげで、今私はreq.bodyundefinedで見つけましたが、新たな疑問が再びtoString作品を作る方法ですか?私はreq.body.toString()は以下のように文字列を返すようにしたい:

enter image description here

はどのように適切なtoString方法を再署名しますか?

私はdeleteを試しましたが、定義されていませんtoString、良いです。参照:

enter image description here

+2

このメソッドは削除されている可能性があります。これをチェックしてください: 'var foo = {}; foo.ToString(); foo。toString = undefined; foo.toString(); 'これを実行し、何が起こるかを見てください。 – Renan

+0

'__proto__'プロパティを拡張して別のスクリーンショットをアップロードできますか? – Bergi

+1

あなたの付録は、 'delete'が付いています。ちょっとした赤ちゃんです。あなたの例では、 'a'は独自の' toString'メソッドを持っていませんでした。そのプロトタイプから常に守られていました。したがって、 'a'は' toString'メソッドを持たない(つまり、 'a.hasOwnProperty(" toString ")はfalseです)ので、' delete'は効果がありません。 – apsillers

答えて

14

JS内のすべてのオブジェクトは、toString()メソッドを持っていますか?

番号はObject.prototype(すべての通常のオブジェクトと同様)から継承するか、独自に定義する(または独自のプロトタイプから継承する)だけです。

このような異常なオブジェクトはObject.create(null)で作成できます。継承されたオブジェクトを陰にし、関数ではない(例えば{toString:0})、普通のオブジェクトにtoStringというプロパティを与えることもできますが、それは別のエラーが発生したと思います。あなたのケースでは

、確かにそのようなパラメータを使用した場合.constructor.prototypeをマングリングを避けるために、プロトタイプなしでオブジェクトを作成(DID)bodyParser()で使用querystring parserはないようです。 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)など)。

+1

'toString()'の結果は環境によっても変わる可能性がありますので、存在していてもその出力が特定の関数では信頼できない可能性があることに留意する価値があります。 – max

+1

+1であるが、ここでは 'req.body'は' Object'プロトタイプを持つように見えるので、OPの特別なケースではもっと進んでいるかもしれない。このオブジェクトは 'toString'を非' Object'プロトタイプオブジェクトに委譲しているのでしょうか? – apsillers

+1

@apsillers:うん、それも私が疑うところです。たぶんリクエスト本体の(カスタム) 'toString'メソッドは、他のオブジェクトの' toString() 'を呼び出そうとします... – Bergi

関連する問題