【发布时间】:2026-01-15 09:35:01
【问题描述】:
我想复制 Javascript Error 而不参考。
例子:
const error1 = new Error('error1');
const error2 = error1;
error2.message = 'error2';
console.log(error1);
console.log(error2);
输出:
Error: error2
at evalmachine.<anonymous>:1:16
at Script.runInContext (vm.js:133:20)
at Object.runInContext (vm.js:311:6)
at evaluate (/run_dir/repl.js:133:14)
at ReadStream.<anonymous> (/run_dir/repl.js:116:5)
at ReadStream.emit (events.js:198:13)
at addChunk (_stream_readable.js:288:12)
at readableAddChunk (_stream_readable.js:269:11)
at ReadStream.Readable.push (_stream_readable.js:224:10)
at lazyFs.read (internal/fs/streams.js:181:12)
Error: error2
at evalmachine.<anonymous>:1:16
at Script.runInContext (vm.js:133:20)
at Object.runInContext (vm.js:311:6)
at evaluate (/run_dir/repl.js:133:14)
at ReadStream.<anonymous> (/run_dir/repl.js:116:5)
at ReadStream.emit (events.js:198:13)
at addChunk (_stream_readable.js:288:12)
at readableAddChunk (_stream_readable.js:269:11)
at ReadStream.Readable.push (_stream_readable.js:224:10)
at lazyFs.read (internal/fs/streams.js:181:12)
当我更改error2 时,error1 也会更改。然后我尝试了lodashclone 功能。但不幸的是,它返回的是一个对象,而不是 Error 的实例。有没有办法让我可以复制 Error 而不引用并返回 instanceof Error 而不更改 stack 或其他默认属性?
【问题讨论】:
-
你想用这个来完成什么?
-
我有几个函数在它们的参数中发送错误,我不希望原来的
Error被打断。所以我想为每个函数复制一个Error。就像温斯顿的formats。 -
这是因为当您分配它时,您正在创建一个引用,请尝试仅分配您感兴趣的成员并包装在 String() 中。
-
但是为什么任何处理程序会变异错误对象?
-
winston 库将
info参数设为instanceofError,如果您将Error输入到他们的记录器。我需要更改info参数中的一些属性,因为winston 将他们的消息存储在info[Symbol('message')]
标签: javascript object clone object-reference