我对这一切感到有点困惑......
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构造函数不是函数?
答案 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
}
答案 1 :(得分:2)
Worker
是一个宿主对象,不属于语言规范。它不需要满足语言的所有要求。没有什么可说的,它必须表示自己是从Function
或任何其他构造函数创建的。
其他人如Object
和Function
这样做,因为语言规范要求使用它们。