为什么Firefox中的Function.prototype.func = ...不影响console.log?

时间:2013-05-03 16:52:34

标签: javascript firefox

我已使用Function.prototype.func = ...Function添加了一项功能,但在Firefox中尚未添加console.log

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

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

1 个答案:

答案 0 :(得分: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没有影响。这非常好,因为consolehost object(而不是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