6

Function.prototype.func = ...toを使用して関数を追加しましたFunctionが、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.prototypeしても には影響しませんconsole.logホスト オブジェクト(ECMAScript 仕様のネイティブ オブジェクトではなく) であり、Mozilla (または Google、Microsoft など) が望むように動作する可能性があるconsoleため、これはまったく問題ありません。

なぜこの動作が存在するのですか? 私は 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 に答える