javascript - JavaScript 中使用扩展运算符的原型(prototype)继承

标签 javascript node.js inheritance

在长时间的冲突之后,我正在尝试修复我与 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/

相关文章:

oop - 避免抽象类和继承

node.js - 在 aws beanstalk 上部署流程 nodejs + sequelize

javascript - 在 React 中,是否可以避免在按下浏览器后退按钮时从服务器重新加载数据(不使用 Redux)?

javascript - 我可以设置文本框或文本区域的输入语言吗?

javascript - ES6 模块 : Export single class of static methods OR multiple individual methods

angularjs - 如何使用证书进入 NWJS 和 Linux

javascript - 使用 Mongoose 处理六个文档后,我得到 "Failed to load resource: net::ERR_EMPTY_RESPONSE"

c++ - 从模板参数派生的类没有 protected 成员访问

c++ - 虚拟继承中断初始化列表显式构造函数调用

javascript - 查找设备的位置