【问题标题】:How can I get an javascript error's prototype member object keys? [duplicate]如何获取 javascript 错误的原型成员对象键? [复制]
【发布时间】:2019-12-24 17:48:53
【问题描述】:

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

当我发现错误时遇到了这个问题,我不知道控制台输出是否会因为错误类/类型/....的特殊情况而出现这种情况。

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'...]。只是想知道我做错了什么。

【问题讨论】:

  • 副本提到了不同的属性,但完全相同的问题。

标签: javascript prototype


【解决方案1】:

由于某种原因,namemessage 属性无法在 Error.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)));
}

【讨论】:

    【解决方案2】:
    Object.getOwnPropertyDescriptor(ex.__proto__, "name")
    # => {value: "Error", writable: true, enumerable: false, configurable: true}
    

    不可枚举的属性不会出现在Object.keys 中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-07
      • 1970-01-01
      • 1970-01-01
      • 2011-11-24
      • 2013-05-11
      • 1970-01-01
      相关资源
      最近更新 更多