首页 > 解决方案 > 当复制节点js自定义错误类超级错误变量消失时

问题描述

我有一个从 Error 类扩展的自定义 Err 类。在我复制 Err 类的一个实例之前,一切都很好。复制实例的超级变量未定义!

这是我的代码:

class Err extends Error {
  constructor(code, msg) {
    super(msg);
    this.code = code;
  }
}

const error = new Err(404, 'error message');

console.log(error);
/* { Error: error message
    at repl:1:15
    at Script.runInThisContext (vm.js:122:20)
    at REPLServer.defaultEval (repl.js:332:29)
    at bound (domain.js:402:14)
    at REPLServer.runBound [as eval] (domain.js:415:12)
    at REPLServer.onLine (repl.js:642:10)
    at REPLServer.emit (events.js:203:15)
    at REPLServer.EventEmitter.emit (domain.js:448:20)
    at REPLServer.Interface._onLine (readline.js:308:10)
    at REPLServer.Interface._line (readline.js:656:8) code: 404 }
*/

const copy = { ...error };

console.log(copy);
// { code: 404 }
// where is error.stack and error.name?

解决方案:

将复制方法更改为此

const copy= { ...error };
copy.name = error.name;
copy.message = error.message;
copy.stack = error.stack;

坦克PA .

如果有人有更好的解决方案告诉我。

标签: node.js

解决方案


copy = { ...error };

(1){}对象字面量运算符,创建一个新的 Object,而不是一个新的 Err 对象,

(2)...或传播属性运算符,对于对象文字,只是将提供的对象自己的可枚举属性复制到您的新对象上。

要克隆任何具有属性、方法、getter/setter、不可枚举属性等的完美副本的 javascript 类实例,在通用代码中几乎是不可能的。您可以为您的特定情况创建自己的复制/克隆代码,结​​合Object.assign()/Object.getPrototype()和自定义调整继承的属性和内部类。


推荐阅读