2013-08-16 24 views
14

Jestem zaskoczony faktem, że gdy utworzę nowy obiekt błędu, widzę jego komunikat lub nazwę, ale nie widzę listy jego kluczy przy użyciu standardowych sposobów. Dlaczego?Dlaczego nie widzę kluczy obiektu błędu?

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

Spróbuj 'Object.getOwnPropertyNames()' zamiast 'Object.keys() '. Mogą być nieprzeliczalne. –

+3

Jako przykład, 'Object.getOwnPropertyDescriptor (err, 'stack')' pokazuje 'wyliczalne: false'. – apsillers

Odpowiedz

13

właściwości JavaScript może być non-przeliczalny, co oznacza, że ​​nie pojawia się w for..in pętli lub Object.keys wyników.

Możesz użyć , aby uzyskać wszystkie właściwości (wyliczalne lub nieprzeliczalne) bezpośrednio na obiekcie. Mówię "bezpośrednio", ponieważ normalne wyliczenie wyszukuje prototypowy łańcuch obiektu, aby uzyskać właściwości przeliczalne na prototypach macierzystych, podczas gdy getOwnPropertyNames nie.

Zatem Object.getOwnPropertyNames(err) pokazuje tylko

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

Obiekt name jest non-przeliczalny własnością Error.prototype i nigdy nie jest ustawiony bezpośrednio na przykład Error. (Prototypowanie podsumowanie: przy próbie dostępu err.name, odnośnika err okazuje się nic, więc interpreter patrzy na Error.prototype, który ma właściwość name).

+1

Node.js używa V8, która nie interpretuje w żadnym momencie: P – Esailija

+0

Nadal nie widzę właściwości 'stack' w Firefoksie 45:' e = new Error ("Hi!"); Object.getOwnPropertyNames (e); // Array ["fileName", "lineNumber", "columnNumber", "message"] '. –

+0

@kiroh Nie mam Firefoksa do testowania, ale co robi 'Object.getOwnPropertyNames (Object.getPrototypeOf (err))? Możliwe, że w Firefox 'stack' jest odziedziczoną właściwością accessora. (Potwierdź to za pomocą 'Object.getOwnPropertyDescriptor (Object.getPrototypeOf (err)," stack ")' i sprawdź właściwości 'get' i' set'.) – apsillers

Powiązane problemy