如何获取javascript错误的原型成员对象键?

时间:2019-12-24 04:11:09

标签: javascript prototype

如何获取javascript错误的原型成员对象键?

当我发现错误时,我遇到了这个问题,我不知道控制台输出是否以这种方式运行,因为有关Error类/类型/...。

try {
  throw new Error('sample error')
} catch (ex) {
  console.log(ex instanceof Error)
  //true

  console.log(ex.message)
  //sample error

  console.log(Object.keys(ex))
  //[] fine as i suppose the class/type members exist in prototype

  console.log(ex.__proto__)
  //{name:'error', message:'', constructor:.... i suppose these are the default properties of Error

  console.log(Object.keys(ex.__proto__))
  //[] how come empty array still??? 
}

我认为最后一条语句console.log(Object.keys(ex.__proto__))应该返回['name','message'...]。只是想知道我做错了什么。

2 个答案:

答案 0 :(得分:2)

由于某些原因,name不能枚举messageError.prototype属性。但是您可以使用Object.getOwnPropertyNames来获取属性的列表,这些属性都是可枚举的和不可枚举的:

try {
  throw new Error('sample error')
} catch (ex) {
  console.log(Object.getOwnPropertyNames(ex.__proto__));
}

Object.keys将返回一个仅包含可枚举(和自有)属性的数组。

请注意,__proto__已过时。最好改用Object.getPrototypeOf

try {
  throw new Error('sample error')
} catch (ex) {
  console.log(Object.getOwnPropertyNames(Object.getPrototypeOf(ex)));
}

答案 1 :(得分:1)

Object.getOwnPropertyDescriptor(ex.__proto__, "name")
# => {value: "Error", writable: true, enumerable: false, configurable: true}

不可枚举的属性不会显示在Object.keys中。