gpt4 book ai didi

javascript - es6对象传播的奇怪行为

转载 作者:太空宇宙 更新时间:2023-11-04 02:59:55 25 4
gpt4 key购买 nike

我有以下示例

module.exports = (err, req, res, next) => {
err.statusCode = err.statusCode || 500;
err.status = err.status || 'error';

if (process.env.NODE_ENV === 'development') {
sendDevError(err, req, res);
} else if (process.env.NODE_ENV === 'production') {
console.log(err); // { message: 'test message', statusCode: '404', status: 'failed' }
let error = { ...err };
console.log(error); // { statusCode: '404', status: 'failed' }
// error.message = err.message;
if (error.name === 'CastError') error = handleCastErrorDB(error);
if (error.code === 11000) error = handleDuplicateFieldsDB(error);
if (error.name === 'ValidationError')
error = handleValidationErrorDB(error);
if (error.name === 'JsonWebTokenError') error = handleJWTError();
if (error.name === 'TokenExpiredError') error = handleJWTExpiredError();
sendProdError(error, req, res);
}
};

魔法随着对象的传播而出现。当我克隆时err由于某种原因反对message我的克隆对象中缺少属性。我通过输入 error.message = err.message 解决了这个问题对象传播后。但这种方法并不是我想要实现的目标。有人能解释一下对象传播在幕后是如何工作的吗?我该怎么做才能解决这个奇怪的错误?

最佳答案

我认为您在问为什么执行此操作时未复制消息:

let error = { ...err };

答案是属性传播仅处理源对象的自己可枚举属性。 message property Error 实例的数量是继承的属性,而不是“自己的”属性。

下面的示例显示了这种区别:

const p = {message: "value"};
const c = Object.create(p);
c.own = "prop";
console.log(c.message); // "value";
console.log("message" in c); // true
console.log(c.hasOwnProperty("message")); // false

console.log({...c}); // {"own": "prop"}

// Copy message onto the object
c.message = c.message;
console.log({...c}); // {"own": "prop", "message": "value"}
.as-console-wrapper {
max-height: 100% !important;
}

关于javascript - es6对象传播的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60588515/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com