6

我添加了一个使用Function.prototype.func = ...toFunction但在 Firefox 中尚未添加的功能console.log

Function.prototype.func = function () { return this.toString(); };
alert(typeof console.log.func); // in FF: undefined, in Chrome: function

这是一个错误还是有任何原因?

4

1 回答 1

2

在 Firefox 中,这很能说明问题:

var foo = function() {}
foo.__proto__ == Function.prototype;

true,而语句:

console.log.__proto__ == Function.prototype;
console.log instanceof Function;

都是false

因此,console.log不包含Function.prototype在其原型链中,因此更改Function.prototypeconsole.log. 这完全没问题,因为console它是一个宿主对象(而不是 ECMAScript 规范中的原生对象),它的行为可能与 Mozilla(或 Google,或 Microsoft 等)一样。

为什么会存在这种行为?我不是 Firefox 开发人员,所以我不能肯定地说,但我最好的猜测是,这是专门完成的,因为console它是一个调试工具。如果你乱用Function的原型链,然后想用它console.log来验证你在做什么,那么如果你的调试报告工具本身开始搞砸并向你误报事情,那就太糟糕了。

编辑:

这些console函数有一个单独的原型链,它们都使用:

console.log.__proto__ == console.dir.__proto__ // true
console.log.__proto__.func = 5;
console.dir.__proto__.func == 5  // true
于 2013-05-03T17:07:13.090 回答