对象解构错误将导致没有消息属性

问题描述 投票:1回答:4

我正在尝试破坏错误,以便我可以更改错误而不影响原始错误。

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

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

但是输出是一个空对象{}。我期望freeError至少具有消息属性,但没有

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

我知道一种解决此问题的方法,但是需要额外的工作{...error, message: error.message}。所以,是的,我只需要一个clarification,这样我就可以确定自己没有丢失任何东西。谢谢。

javascript custom-errors object-destructuring
4个回答
2
投票

对象散布only copies可枚举的自身属性,并且至少在某些环境中,message不是可枚举的自身属性。

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

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

console.log(Object.getOwnPropertyDescriptor(error, 'message'));
console.log(Object.getOwnPropertyDescriptor(Object.getPrototypeOf(error), 'message'));

使用message: error.message可能是最简单的选择。


0
投票

解构对象仅考虑ownPropertyError实例没有任何非继承的属性。这就是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


0
投票

messageaccessor property of the Error prototype

the destructuring assignment的其余语法和Object.assign的语法都不从源对象复制其实际上不是其自身的属性(即,它源自其原型对象之一,例如toStringvalueOf)。因此,您应该像您提到的那样明确地执行此操作,或者在错误对象上实际定义message属性(我不建议这样做)。


0
投票
const freeError = {...error};   

类似于

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

[如果要获取属性,

const freeError = Object.assign({message: error.message}, error);
© www.soinside.com 2019 - 2024. All rights reserved.