如何在没有引用的情况下复制Javascript错误?

如何在没有引用的情况下复制Javascript错误?,javascript,object,clone,object-reference,Javascript,Object,Clone,Object Reference,我想复制JavascriptError,无需引用 例如: const error1 = new Error('error1'); const error2 = error1; error2.message = 'error2'; console.log(error1); console.log(error2); 输出: 错误:error2 在evalmachine克隆功能。但不幸的是,它返回的是一个对象,而不是一个错误实例。有没有一种方法可以让我在不引用的情况下复制错误,并在不更改堆栈或其

我想复制Javascript
Error
,无需引用

例如:

const error1 = new Error('error1');
const error2 = error1;

error2.message = 'error2';

console.log(error1);
console.log(error2);
输出:

错误:error2

在evalmachine<代码>克隆
功能。但不幸的是,它返回的是一个对象,而不是一个错误实例。有没有一种方法可以让我在不引用的情况下复制
错误
,并在不更改
堆栈
或其他默认属性的情况下返回
错误
的实例?

如果您坚持要单独复制错误,我认为您最好的办法是创建一个新错误并复制您想要保留的属性:

function copyError(err, newMessage) {
    var newErr = new Error(newMessage);

    newErr.stack = err.stack;
    // copy other properties
}

var newErr = copyError(e, "New message");
然而,我不认为这是一个很好的方法

另一个选项是执行与.NET类似的操作-创建新错误并将原始错误放置在该错误的属性上:

var newErr = new Error("New message");
newErr.innerError = originalError;

这里的缺点是,任何检查这些错误的操作都需要检查是否存在
.innerError
属性,并相应地使用它。

您可以尝试手动输入一些重要属性:

const error1 = new Error('error1');
const error2 = new error1.constructor(error1.message);

if (error1.stack) {
  error2.stack = error1.stack;
}

if (error1.code) {
  error2.code = error1.code;
}

if (error1.errno) {
  error2.errno = error1.errno;
}

if (error1.syscall) {
  error2.syscall = error1.syscall;
}

error2.message = 'error2';

console.log(error1);
console.log(error2);

你想用这个来完成什么?我有几个函数在它们的参数中发送错误,我不想中断原始的
错误。因此,我想为每个函数复制一个
错误。与winston中的
格式类似。这是因为当您分配它时,您正在创建一个引用,请尝试只分配您感兴趣的成员,并用字符串()换行。但为什么任何处理程序都会变异错误对象?如果您向其记录器输入
错误
,winston library会将
信息
参数作为
错误
的实例。我需要更改
info
参数中的一些属性,因为winston将它们的消息存储在
info[Symbol('message')]