2013-05-03 15 views
6

は私がFunctionFunction.prototype.func = ...を使用して機能を追加したが、Firefoxでは、それはconsole.logを追加されていない。FirefoxでなぜFunction.prototype.func = ...はconsole.logに影響しませんか?

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

それはバグですか、そのためにどのような理由があるのでしょうか?

+3

console'はそれがないことを意味*ホストオブジェクト*、である 'ので、おそらくそれです仕様ルールに縛られています - [ネイティブオブジェクトとホストオブジェクトの違いは何ですか?](http://stackoverflow.com/questions/7614317/what-is-the-difference-between-native-objects-and-host -objects) – apsillers

+0

@apsillersありがとう、私は他のホストオブジェクトを試していますが、彼らはこの問題がないようです。 –

答えて

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.prototypeを変更するとconsole.logには影響しません。 consoleは(ECMAScript仕様のネイティブオブジェクトではなく)host objectであり、Mozilla(またはGoogle、Microsoftなど)が望むように動作する可能性があるため、これはまったく問題ありません。

なぜこの現象がありますか?私はFirefoxデベロッパーではないので、私は確信はできませんが、consoleデバッグツールなので、これが具体的に行われたと思います。 Functionのプロトタイプチェーンで悩んで、console.logを使って何をしているのかを確認したいのであれば、デバッグレポートツールがあなたのことを誤って報告してしまうとひどいことになります。

EDIT:

consoleの機能は、それらのすべてで使用される別のプロトタイプチェーンを持っている:

console.log.__proto__ == console.dir.__proto__ // true 
console.log.__proto__.func = 5; 
console.dir.__proto__.func == 5 // true 
+0

ハム、多分それが理由です。 btw、 'console'はホストオブジェクトですが、' console.log'はホストオブジェクトではないと思われる関数です。 –

+0

'typeof console.log'は 'function'を返し、' console.log.constructor'は "Function()"を返し、 'console.log.constructor.name'は" Function "を返します。 'prototype' –

+0

@CrayonViolentだから私は本当に混乱しています。 –

関連する問題