0

这种情况下工作得很好:

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");

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

*这些代码示例的游乐场。

4

1 回答 1

0

内置类型 ( Error, Array) 是奇异的,这意味着它们的构造函数是不正常的,并且它们的实例的对象是不正常的,它们是特殊的内部对象。因此:

  Error.call(this, message)

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

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

消息被设置在那个奇异的对象上,而不是this.

super(....)在你可以访问之前被调用的类中工作this,因此this可以是外来对象,你不能在没有类的情况下复制该行为。

继续阅读

于 2018-12-09T14:45:28.253 回答