Object instanceof Function //true
Function instanceof Object //true
两个Object是不是 不是同一个。
Object instanceof Function //true
Function instanceof Object //true
两个Object是不是 不是同一个。
其实并不矛盾的, 按照instanceof的定义: The instanceof operator tests whether an object has in its prototype chain the prototype property of a constructor.
就是说 instanceof 会遍历 左 运算数的原型链,如果原型链上匹配到 右 运算数的 原型, 就返回true
左运算数被视为一个对象, 而右运算数被看做一个构造器(constructor)。
我们之所以感到别扭, 是因为 javascript 并没有其他语言中(Java/C++)基于严格类型检查的类继承机制, 而是通过原型链来实现的模拟继承, 而且是允许有循环出现。
当 Object instanceof Function 时:
Object.getPrototypeOf(Object) -> fucntion () {}
Function.prototype -> fucntion () {}
匹配 返回 true
当 Function instanceof Object 时:
Object.getPrototypeOf(Function) -> function() {}
Object.prototype -> Object {}
不匹配, 继续遍历原型链,
Object.getPrototypeOf(Function.prototype) -> Object {}
匹配, 返回 true
Detail in:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/instanceof
Function在Object的原型链上
,因为Object是一个构造函数
Object也在Function的原型链上
,因为Function也是一个对象
个人认为导致这种“矛盾”的原因有2点,一是instanceof
的奇葩规定,它虽然叫做instance
-of
,但只是检查原型链而已,与继承和实现毫无关系。二是JS中一切都是对象,但对象也有构造函数(Object)
,这本来就是一个循环定义。
楼主请看 Object 和 Function 以及创建的对象和函数的之间的关系图,自然能明白了,图的链接在这里:
https://github.com/zhufengnodejs/node201507/blob/master/6.jsadvance/prototype.md