对象传播错误导致没有消息 属性

Object spread an Error results in no message property

我正在尝试传播错误,以便我可以在不影响原始错误的情况下更改错误。

const error = new Error('Error test');

const freeError = {...error};
console.log(error, freeError);

但是输出的是一个空对象{}。我预计 freeError 至少有 条消息 属性,但有 none.

这是 JavaScript 功能的一部分,还是我的代码或引擎有问题?

我知道解决这个问题的方法,但它需要额外的工作{...error, message: error.message}。所以,是的,我只需要一个说明,这样我就可以确定我没有遗漏任何东西。谢谢。

对象传播only copies可枚举的自身属性,至少在某些环境下,message不是可枚举的属性.

在Chrome中是不可枚举的自身属性,在Firefox中是Error.prototype的属性:

const error = new Error('Error test');

// Chrome logs an object (including "enumerable": false,)
console.log(Object.getOwnPropertyDescriptor(error, 'message'));

// Firefox logs an object (including "enumerable": false,)
console.log(Object.getOwnPropertyDescriptor(Object.getPrototypeOf(error), 'message'));

它依赖于实现。我会手动提取您需要的所有属性:

const error = new Error('Error test');
const { message, stack } = error;
const freeError = { message, stack };
console.log(freeError);

首先,请注意您所做的不是解构——它被称为对象传播

展开对象只考虑 ownProperty 秒。 Error 个实例没有任何非继承属性。这就是为什么 console.log(error) 也输出 {}:

const error = new Error('Error test');

const freeError = {...error};
console.log(error, freeError);

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Properties

因为继承的属性不是传播结果对象的一部分,error 确实有消息 属性(继承自其原型),而 freeError 没有。

检查这个例子:

const str = new String('Hello world');

const freeStr = { ...str };

console.log(str.length); // 11
console.log(freeStr.length); // undefined

如你所见str确实有一个length属性(继承自Stringprototype),而 freeStr 没有 它(原因与您的示例相同)。

同样,请在此处查看 MDN:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Error_instances

const freeError = {...error};   

类似于

const freeError = Object.assign({}, error);

如果要获取属性,

const freeError = Object.assign({message: error.message}, error);