You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中Error对象使用spread operator不生效,如何添加属性且无需新建类

为什么扩展运算符无法复制Error对象的属性?

你遇到的问题核心在于:扩展运算符...仅会复制对象自身的可枚举属性,而Error对象的核心属性(比如message、name、stack)要么是定义在原型链上,要么是自身的不可枚举属性。

你可以用Object.keys(error)验证这一点——执行后会返回空数组,说明Error对象本身没有可枚举的自有属性,自然用{...error}复制不到任何内容,最终只有你手动添加的foo: "bar"。

解决办法

如果想保留Error的核心属性同时添加新属性,可以试试这两种方式:

  1. 手动提取需要的属性:
let error = new Error("new error message")
const extendedError = {
  message: error.message,
  name: error.name,
  stack: error.stack,
  foo: "bar"
}
console.log(extendedError)
  1. 保留Error原型与所有属性:
    通过Object.getOwnPropertyDescriptors获取Error的所有属性描述符,再结合Object.create保留原型链,最后添加新属性:
let error = new Error("new error message")
const extendedError = Object.create(
  Object.getPrototypeOf(error),
  Object.getOwnPropertyDescriptors(error)
)
extendedError.foo = "bar"
console.log(extendedError)

内容的提问来源于stack exchange,提问作者rahul Kushwaha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 10:56:14