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

Try 'Object.getOwnPropertyNames()' вместо 'Object.keys() '. Они могут быть неперечислимыми. –

+3

В качестве примера, 'Object.getOwnPropertyDescriptor (err, 'stack')' показывает 'enumerable: false'. – apsillers

ответ

13

свойство JavaScript может быть несчетными, что означает, что они не появляются в for..in петлях или Object.keys результатов.

Вы можете использовать Object.getOwnPropertyNames, чтобы получить все свойства (перечислимые или неперечислимые) непосредственно на объект. Я говорю «прямо», потому что нормальное перечисление просматривает цепочку прототипов объекта, чтобы получить перечислимые свойства на родительских прототипах, а getOwnPropertyNames - нет.

Таким образом, Object.getOwnPropertyNames(err) только показывает

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

name свойство не является перечислимы собственностью Error.prototype и никогда не устанавливается непосредственно на Error экземпляра. (Прототипирование резюмировать: при попытке получить доступ к err.name, что поиск err поворачивает вверх ничего, так что интерпретатор смотрит на Error.prototype, который действительно имеет name свойство.)

+1

Node.js использует V8, который не интерпретируется ни в какой точке: P – Esailija

+0

Я до сих пор не вижу свойство 'stack' в Firefox 45:' e = new Error («Привет!»); Object.getOwnPropertyNames (е); // Array ["fileName", "lineNumber", "columnNumber", "message"] '. –

+0

@kiroh У меня нет Firefox для тестирования, но что делает 'Object.getOwnPropertyNames (Object.getPrototypeOf (err))' product? Может быть, в Firefox 'stack' есть унаследованное свойство accessor. (Подтвердите это с помощью объекта Object.getOwnPropertyDescriptor (Object.getPrototypeOf (err), «stack») 'и проверки свойств' get' и 'set'.) – apsillers

Смежные вопросы