2013-08-16 11 views
14

Yeni bir Hata nesnesi oluşturduğumda onun mesajını veya adını görebiliyorum, ancak standart yollarını kullanarak anahtarlarının bir listesini göremiyorum gerçeğiyle karıştırıldım. Neden?Neden bir Error nesnesinin anahtarlarını göremiyorum?

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

deneyin 'Object.getOwnPropertyNames()' yerine 'Object.keys() '. Sayısız olabilirler. –

+3

Örnek olarak, 'Object.getOwnPropertyDescriptor (err, 'stack')' 'sayılabilir: false' gösterir. – apsillers

cevap

13

JavaScript özellikleri de for..in halkalarının veya Object.keys sonuçlarında görünmez anlamına gelir olmayan numaralandırılabilir olabilir.

Object.getOwnPropertyNames Tüm özellikleri (numaralandırılabilir veya okunamaz) doğrudan bir nesneye almak için kullanabilirsiniz. "Doğrudan" diyorum çünkü normal numaralandırma nesnesinin prototip zincirini ana prototipler üzerinde sayısız özellik elde etmek için ararken, getOwnPropertyNames bunu yapmıyor.

Böylece Object.getOwnPropertyNames(err) sadece

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

name özelliği Error.prototype olmayan bir numaralandırılabilir özelliğidir ve bir Error örneği Doğrudan ayarlanmış hiçbir zaman göstermektedir. (Prototip geniş özeti: Eğer err.name erişmeye çalıştığınızda, arama err şey ortaya çıkıyor, bu nedenle tercüman bir name özelliği var ki, Error.prototype bakar.)

+1

Node.js, herhangi bir noktada yorumlamayan V8'i kullanır: P – Esailija

+0

Firefox 45'te 'stack' özelliği hala göremiyorum:' e = new Error ("Hi!"); Object.getOwnPropertyNames (e) // Array ["fileName", "lineNumber", "columnNumber", "message"] '. –

+0

@kiroh Üzerinde test yapmak için Firefox'um yok, ancak Object.getOwnPropertyNames (Object.getPrototypeOf (err)) 'nı üretiyor? Firefox'taki 'stack' devralınan bir accessor özelliğidir. (Bunu "Object.getOwnPropertyDescriptor (Object.getPrototypeOf (err)," stack ") ile onaylayın ve' get' ve 'set' özelliklerini kontrol edin.) – apsillers

İlgili konular