【发布时间】:2020-10-28 21:10:14
【问题描述】:
经过长时间的冲突,我正在尝试修复我与 JavaScript 的关系:D
在以下代码中:
class e extends Error{
constructor(message,id){
super(message)
this.id = id
}
}
const e1 = new e('message',12);
const e2 = {...e1}
console.log(e2);
}
结果是{id:12}
如您所见,message 属性不存在,我理解这是因为 message 属性不属于 e2。
我的问题是最好的方法是什么使得结果是{id:12,message:'message'}
我知道这可能是一个非常新手的问题,但我感谢您对此的详细说明
用例
我在下面有一个全局错误处理程序,如果在生产模式下,我需要将 err 对象复制到错误对象中,但我发现我需要手动添加这一行 error.message = err.message;
我想知道是否可以在不手动添加此行的情况下克隆 err 对象,即在不知道其超类属性的情况下克隆对象的最佳方法是什么?
module.exports = (err, req, res, next) => {
err.statusCode = err.statusCode || 500;
err.status = err.status || 'error';
console.log(process.env.NODE_ENV)
if (process.env.NODE_ENV === 'development') {
sendErrorDev(err, res);
} else if (process.env.NODE_ENV === 'production') {
let error = { ...err };
error.message = err.message;
// console.log(err)
// if (error.name === 'CastError') error = handleCastErrorDB(error);
if (error.code === 11000) error = handleDuplicateFieldsDB(error);
// if (error.name === 'ValidationError')
// error = handleValidationErrorDB(error);
sendErrorProd(error, res);
}
};
【问题讨论】:
-
也许
this.message不可枚举?Object.keys(e1) // ['id']让我觉得不是。所以传播运算符会错过它。 -
@evolutionxbox 是的,我知道 e2.hasOwnProperty('id') -> true 但是 e2.hasOwnProperty('message') -> false,我想知道如果可能的话如何进行传播操作员工作
-
消息需要成为可枚举的属性。这可能意味着您不能从 Error 继承。
-
老实说,如果我知道怎么写,我会写一个答案。我知道
Object.defineProperty会有所帮助。 ——如果你不能使用它定义的属性,继承自 Error 的原因是什么?或者也许使用传播作为一种继承方式并不好? -
从您列出的内容来看,您需要克隆它并不明显。最终重要的是错误消息。对于任意错误,您可能希望根据之前的错误
new Error(oldErr.message)构建它。您可以将原始错误存储在errors字段中,以备日后需要时参考 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
标签: javascript node.js inheritance