`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");
我想知道为什么?
我的代码有问题还是什么?
内置类型(Error
,Array
)是exotic,也就是说他们的构造函数不正常,他们实例的对象是不正常,它们是特殊的内部对象。因此:
Error.call(this, message)
不起作用,因为 Error
必须 return 一个奇异对象,而 this
是一个常规对象,引擎无法将一个对象转换为另一个对象。因此它 return 是一个新的异常错误(您在代码中忽略了它):
let exotic = Error.call(this);
exotic === this // false
消息设置在那个异国情调的对象上,而不是 this
。
这在 类 中有效,因为 super(....)
在您可以访问 this
之前被调用,因此 this
可能是异国情调的对象,如果没有,您将无法复制该行为类.
这个案例很好用:
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");
我想知道为什么? 我的代码有问题还是什么?
内置类型(Error
,Array
)是exotic,也就是说他们的构造函数不正常,他们实例的对象是不正常,它们是特殊的内部对象。因此:
Error.call(this, message)
不起作用,因为 Error
必须 return 一个奇异对象,而 this
是一个常规对象,引擎无法将一个对象转换为另一个对象。因此它 return 是一个新的异常错误(您在代码中忽略了它):
let exotic = Error.call(this);
exotic === this // false
消息设置在那个异国情调的对象上,而不是 this
。
这在 类 中有效,因为 super(....)
在您可以访问 this
之前被调用,因此 this
可能是异国情调的对象,如果没有,您将无法复制该行为类.