无法在Google Chrome中重新定义Error.prototype.toString

时间:2018-02-27 23:04:25

标签: javascript prototype

我正在尝试重新定义 Error.prototype对象的方法 toString ,我无法在Google Chrome Canary中执行此操作,但我可以在Firefox中执行此操作。< / p>

你可以尝试自己做,这是代码:

Error.prototype.toString = () => 'booooka'
throw new Error('Message, that have never been shown') // "booooka" in Firefox, "Message" in Google Chrome
  1. 在Google Chrome中执行此操作有什么问题?
  2. 我如何在Google Chrome中执行此操作?
  3. Firefox:57.0.4 Chrome:66.0.3356.0(官方构建)金丝雀(64位)

    P.S。我试图将此代码粘贴到jsbin / jsfiddle,但我的结果与Chrome中的结果相同。我很困惑,也许你可以帮助我。

    谢谢。

2 个答案:

答案 0 :(得分:0)

Chrome可让您覆盖toString,但其控制台会向您显示错误stack而不是toString()。由于stack属性被定义为自己的属性而不是被赋值,因此没有简洁的方法来覆盖它(并且可能无法覆盖它的周期)。

考虑这种类型的构造函数:

const defineProperty = Object.defineProperty;

const Error = function () {
    defineProperty(this, 'stack', {
        configurable: true,
        writable: true,
        value: '…',
    });
};

与构造函数设置相比,我完全没有意识到以任何方式更改此上下文中new Error().stack的值。

但是,这可能是一件好事。你的目标是什么?

答案 1 :(得分:0)

如果您这样做,请添加到上一个答案:

throw new Error('Message, that have never been shown').toString(); 

&#39; bookah&#39;将显示,因此该问题与Error类的实现有关,而不是与重写原型属性

有关