为什么我看不到Error对象的键?

Sel*_*lah 22 javascript node.js

令我感到困惑的是,当我创建一个新的Error对象时,我可以看到它的消息或名称,但我无法通过标准方式看到它的键列表.这是为什么?

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

aps*_*ers 19

JavaScript属性可能是不可枚举的,这意味着它们不会出现在for..in循环或Object.keys结果中.

您可以使用Object.getOwnPropertyNames直接在对象上获取所有属性(可枚举或不可枚举).我说"直接"是因为普通枚举查找对象的原型链以获取父原型上的可枚举属性,而getOwnPropertyNames不是.

因此,Object.getOwnPropertyNames(err)只显示

['stack',
 'arguments',
 'type',
 'message']
Run Code Online (Sandbox Code Playgroud)

name属性是一个不可枚举的属性,Error.prototype并且永远不会直接在Error实例上设置.(原型回顾:当你尝试访问时err.name,查找err没有任何内容,所以解释器会查看Error.prototype,它有一个name属性.)