在长时间的冲突之后,我正在尝试修复我与 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}
正如您所看到的,消息属性不存在,我知道发生这种情况是因为消息属性不属于 e2。
我的问题是最好的方法是什么,使结果为 {id:12,message:'message'}
我知道这可能是一个非常新手的问题,但我感谢您对此的详细阐述
用例
我下面有一个全局错误处理程序,如果在生产模式下,我需要将 err 对象复制到错误对象中,但我发现我需要手动添加此行 error.message = err.message;
我想知道是否可以在不手动添加此行的情况下克隆错误对象,即在不知道其父类(super class)属性的情况下克隆对象的最佳方法是什么?
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);
}
};
最佳答案
正如评论中所确定的,这与继承关系不大,而与message
not being enumerable关系更大。 。它仍然是每个实例自己的属性。
您可以在自定义子类中使用 Object.defineProperty
更改它:
class E extends Error{
constructor(message,id){
super(message)
Object.defineProperty(this, 'message', {enumerable: true})
this.id = id
}
}
const e = new E('message', 12);
console.log({...e});
这将导致对象文字中的扩展语法复制属性。但是,如果您的目标是获取具有相同自定义原型(prototype)的新实例,则不能使用扩展语法。而是编写一个方法:
class E extends Error{
constructor(message,id){
super(message)
this.id = id
}
clone() {
return new E(this.message, this.id)
}
}
const e = new E('message', 12);
console.log(e.clone());
关于javascript - JavaScript 中使用扩展运算符的原型(prototype)继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64581329/