我凌乱了 JavaScript原型问题, 到底谁是谁的爹

红叶舞秋山
  • 440
   Object   instanceof Function //true

   Function instanceof Object   //true

两个Object是不是 不是同一个。

回复
阅读 3.4k
4 个回答

其实并不矛盾的, 按照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++)基于严格类型检查的类继承机制, 而是通过原型链来实现的模拟继承, 而且是允许有循环出现。

  1. 当 Object instanceof Function 时:
    Object.getPrototypeOf(Object) -> fucntion () {}
    Function.prototype -> fucntion () {}

匹配 返回 true

  1. 当 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),这本来就是一个循环定义。

宣传栏