Почему я не вижу ключи объекта Error?

Меня озадачивает тот факт, что когда я создаю новый объект Error, я могу видеть его сообщение или имя, но я не вижу список его ключей, используя стандартные способы. Почему это?

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

Ответы

Ответ 1

Свойства 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.)