Ответ 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
.)