什么类型的对象是JavaScript中的“Worker”

时间:2012-10-22 04:41:14

标签: javascript web-worker

我对这一切感到有点困惑......

Chrome和Firefox都告诉我不同​​的事情,我找不到提到它的规范中的任何部分,但是:

Chrome中的

Object instanceof Function // true
Function instanceof Object // true
Worker instanceof Object // true
Worker instanceof Function // false <- WTF???
FireFox中的

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

当然,初始化的新Worker()既是Worker又是Object,但为什么Worker构造函数不是函数?

2 个答案:

答案 0 :(得分:4)

类型函数的工人 IS 。您可以使用typeof operator进行检查。但是,它不继承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运算符测试对象是否在其原型中   链接构造函数的prototype属性。

Worker不继承Function构造函数的原型,因此它不是Function的实例。


以下是使用typeof operator检查用户浏览器是否支持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
}​

Fiddle

答案 1 :(得分:2)

Worker是一个宿主对象,不属于语言规范。它不需要满足语言的所有要求。没有什么可说的,它必须表示自己是从Function或任何其他构造函数创建的。

其他人如ObjectFunction这样做,因为语言规范要求使用它们。