我正在尝试重新定义 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
Firefox:57.0.4 Chrome:66.0.3356.0(官方构建)金丝雀(64位)
P.S。我试图将此代码粘贴到jsbin / jsfiddle,但我的结果与Chrome中的结果相同。我很困惑,也许你可以帮助我。
谢谢。
答案 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类的实现有关,而不是与重写原型属性
有关