原型链相关

50 阅读1分钟

Object与Function的关系

  1. 首先ObjectFunction都是构造函数,而所有的构造函数的都是Function的实例对象. 因此ObjectFunction的实例对象

2. Function.prototypeObject的实例对象

  1. 实例对象的原型(我们以__proto__来表示)会指向其构造函数的prototype属性, 因此 Object.proto === Function.prototype, Function.proto === Function.prototype, Function.prototype.proto === Object.prototype
  2. 当我们访问一个属性值的时候, 它会沿着原型链向上查找, 直到找到或者到Object.prototype.proto(为null)截止.

假如我们有以下例子:

var foo = {},
    F = function(){};

Object.prototype.a = 'value a';
Function.prototype.b = 'value b';

console.log(foo.a)    // value a
console.log(foo.b)    // undefined
console.log(F.a)      // value a
console.log(F.b)      // value b

那么

  • foo.a的查找路径: foo自身: 没有 ---> foo.proto(Object.prototype): 找到value a
  • foo.b的查找路径: foo自身: 没有 ---> foo.proto(Object.prototype): 没有 ---> foo.proto.proto (Object.prototype.proto): 没有
  • F.a的查找路径: F自身: 没有 ---> F.proto(Function.prototype): 没有 ---> F.proto.proto(Object.prototype): 找到value a
  • F.b的查找路径: F自身: 没有 ---> F.proto(Function.prototype): 找到value b

5.关于instanceof的结果不要仅从字面上理解, instance 即实例,instanceof 即xx的实例。 它的计算规则是: 如果右侧构造函数的prototype属性能在左侧的对象的原型链中找到, 那么就返回true, 否则就返回false

  • Object intanceof Function: Object是不是Function的实例? Object.proto === Function.prototype, 因为结果为true
  • Function instanceof Object: Function是不是Object的实例? Function.proto.proto === Object.prototype, 因为结果也为true

至于你说的, ObjectFunction互为实例对象是不对的,ObjectFunction的实例对象, Function.prototypeObject的实例对象。

6.实例对象的constructor属性指向其构造函数, 因此Object.constructor === Function, Function.constructor === Function.