`message` 字段值未在 NodeJS 的 `CustomError` class 中设置,通过函数构造函数 classical 继承

The `message` field value is not set in `CustomError` class in NodeJS with the classical inheritance through the function-constructor

这个案例很好用:

class CustomError2015 extends Error {
    constructor(message) {
        super(message); // here the message is set correctly
        console.log("Message: " + this.message); 
    }
}

throw new CustomError2015("ECMAScript 2015 class inheritance");

我原以为这个会以同样的方式工作,但事实并非如此:

function CustomError(message){
    Error.call(this, message); // here the message IS NOT set
    console.log("Message: " + this.message); 
}
CustomError.prototype = Object.create(Error.prototype);
CustomError.prototype.constructor = CustomError;

throw new CustomError("CustomError function-like inheritance");

我想知道为什么? 我的代码有问题还是什么?

* These code samples' playground.

内置类型(Error,Array)是exotic,也就是说他们的构造函数不正常,他们实例的对象是不正常,它们是特殊的内部对象。因此:

  Error.call(this, message)

不起作用,因为 Error 必须 return 一个奇异对象,而 this 是一个常规对象,引擎无法将一个对象转换为另一个对象。因此它 return 是一个新的异常错误(您在代码中忽略了它):

  let exotic = Error.call(this);
  exotic === this // false

消息设置在那个异国情调的对象上,而不是 this

这在 类 中有效,因为 super(....) 在您可以访问 this 之前被调用,因此 this 可能是异国情调的对象,如果没有,您将无法复制该行为类.

read on