2013-08-16 4 views
14

新しいErrorオブジェクトを作成したときにメッセージや名前が表示されることがありますが、標準的な方法でそのキーのリストを見ることはできません。何故ですか?Errorオブジェクトのキーが表示されないのはなぜですか?

> err = new Error("an error") 
[Error: an error] 
> err.message 
'an error' 
> err.name 
'Error' 
> Object.keys(err) 
[] 
> JSON.stringify(err) 
'{}' 
+11

てみ 'Object.getOwnPropertyNames()'の代わりに 'Object.keys () 'を返します。それらは列挙できないかもしれません。 –

+3

例として、 'Object.getOwnPropertyDescriptor(err、 'stack')'は 'enumerable:false'を示します。 – apsillers

答えて

13

JavaScriptプロパティは、彼らがfor..inループまたはObject.keys結果に表示されないことを意味非可算であってもよいです。

Object.getOwnPropertyNamesを使用すると、オブジェクトにすべてのプロパティ(列挙型または列挙型でない)を直接取得できます。 getOwnPropertyNamesは、親プロトタイプの列挙可能なプロパティを取得するために、通常の列挙がオブジェクトのプロトタイプチェーンを検索するため、「直接」と言います。

したがって、Object.getOwnPropertyNames(err)のみnameプロパティはError.prototypeの非列挙性であり、Errorインスタンスに直接設定されることはない

['stack', 
'arguments', 
'type', 
'message'] 

を示しています。 (プロトタイピングの要約:あなたはerr.nameにアクセスしようとすると、検索errは何をターンアップしないので、インタプリタはname性質を持っていた、Error.prototypeに見えます。)

+1

Node.jsは、いつでも解釈しないV8を使用しています:P – Esailija

+0

Firefox 45の 'stack'プロパティはまだ見えません。' e = new Error( "Hi!"); Object.getOwnPropertyNames(e); //配列["fileName"、 "lineNumber"、 "columnNumber"、 "message"] '。 –

+0

@kirohテストするFirefoxはありませんが、 'Object.getOwnPropertyNames(Object.getPrototypeOf(err))'は何を生成しますか? Firefoxでは 'stack'が継承されたアクセサプロパティであるかもしれません。 (これを 'Object.getOwnPropertyDescriptor(Object.getPrototypeOf(err)、" stack ")'で確認し、 'get'と' set'プロパティを確認してください) – apsillers