JavaScript中Error对象使用spread operator不生效,如何添加属性且无需新建类
为什么扩展运算符无法复制Error对象的属性?
你遇到的问题核心在于:扩展运算符...仅会复制对象自身的可枚举属性,而Error对象的核心属性(比如message、name、stack)要么是定义在原型链上,要么是自身的不可枚举属性。
你可以用Object.keys(error)验证这一点——执行后会返回空数组,说明Error对象本身没有可枚举的自有属性,自然用{...error}复制不到任何内容,最终只有你手动添加的foo: "bar"。
解决办法
如果想保留Error的核心属性同时添加新属性,可以试试这两种方式:
- 手动提取需要的属性:
let error = new Error("new error message") const extendedError = { message: error.message, name: error.name, stack: error.stack, foo: "bar" } console.log(extendedError)
- 保留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
相关产品推荐
相关产品推荐

