5

私はこれらすべてについて少し混乱しています...

Chrome と Firefox はどちらも異なることを教えてくれますが、仕様にはそれについて言及している部分が見つかりませんでしたが、

クロムで:

Object instanceof Function // true
Function instanceof Object // true
Worker instanceof Object // true
Worker instanceof Function // false <- WTF???

ファイアフォックスで:

Object instanceof Function // true
Function instanceof Object // true
Worker instanceof Object // false
Worker instanceof Function // false

もちろん、初期化された new Worker() は Worker と Object の両方ですが、なぜ Worker コンストラクターは関数ではないのでしょうか?

4

2 に答える 2

4

タイプ関数のワーカーIS 。typeof演算子を使用して確認できます。ただし、Function コンストラクターのプロトタイプを継承しないため、Function ではありませんinstanceof

より実用的な例を次に示します。

function fun(){};
Function.prototype.foo = 'my custom Function prototype property value';
console.log(fun.foo); //my custom Function prototype property value
console.log(fun instanceof Function); //true

console.log(typeof Worker); //function, the constructor
console.log(Worker.foo); //undefined, this host constructor does not inherit the Function prototype
console.log(Worker instanceof Function); //false

var worker = new Worker('test.js');
console.log(typeof worker); //object, the instance
console.log(worker.foo); //undefined, instance object does not inherit the Function prototype
console.log(worker instanceof Function); //false​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​

MDNから:

オペレーターは、オブジェクトのinstanceofプロトタイプ チェーンにコンストラクターのプロトタイプ プロパティがあるかどうかをテストします。

Worker は Function コンストラクターのプロトタイプを継承しないため、Function のインスタンスではありません。


typeofオペレーターを使用して、ユーザーのブラウザーが Web Workers API をサポートしているかどうかを確認する例を次に示します。

if (typeof window.Worker !== 'undefined') {
    alert('Your browser supports Web Workers!');
} else {
    alert('Sorry, but no.'); //too lazy to write a proper message for IE users
}​

フィドル

于 2012-10-22T04:57:21.727 に答える
2

Workerはホスト オブジェクトであり、言語仕様の一部ではありません。言語のすべての要件を満たす必要はありません。Functionまたは他のコンストラクターから作成されたものとしてそれ自体を表す必要があることは言うまでもありません。

他の人は、言語仕様でそれが必要なため、好きObjectでやっています。Function

于 2012-10-22T04:57:17.687 に答える