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

Worker IS类型的函数。您可以使用typeofoperator进行检查。但是,它不继承 Function 构造函数的原型,因此它不是instanceofFunction。

这是一个更实际的例子:

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是一个宿主对象,不是语言规范的一部分。它不需要满足语言的所有要求。没有什么可以说它必须将自己表示为是从 theFunction或任何其他构造函数创建的。

其他人喜欢ObjectFunction这样做是因为语言规范要求他们这样做。

于 2012-10-22T04:57:17.687 回答