我正在尝试破坏错误,以便我可以更改错误而不影响原始错误。
const error = new Error('Error test');
const freeError = {...error};
console.log(error, freeError);
但是输出是一个空对象{}
。我期望freeError
至少具有消息属性,但没有。
这是JavaScript功能的一部分,还是我的代码或引擎有问题?
我知道一种解决此问题的方法,但是需要额外的工作{...error, message: error.message}
。所以,是的,我只需要一个clarification,这样我就可以确定自己没有丢失任何东西。谢谢。
对象散布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
可能是最简单的选择。
解构对象仅考虑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
message
是accessor property of the Error prototype。
the destructuring assignment的其余语法和Object.assign的语法都不从源对象复制其实际上不是其自身的属性(即,它源自其原型对象之一,例如toString
和valueOf
)。因此,您应该像您提到的那样明确地执行此操作,或者在错误对象上实际定义message
属性(我不建议这样做)。
const freeError = {...error};
类似于
const freeError = Object.assign({}, error);
[如果要获取属性,
const freeError = Object.assign({message: error.message}, error);