彻底理清prototype、__proto__与constructor的关系

146 阅读2分钟

__proto__属性

  1. __proto__和 constructor 属性是对象所独有的;
  2. prototype 属性是函数独有的。函数也是一种对象,所以也拥有__proto__和 constructor 属性。

__proto__属性都是由一个对象指向另一个对象。即指向它们的原型对象。

作用:当访问一个对象的属性时,如果该对象内部不存在这个属性,那就会去它的__proto__属性所指向的那个对象里找,如果找不到就继续往上找,直至null。

prototype 属性

prototype 属性是函数所独有的,它是从一个函数指向一个对象。它的含义是函数的原型对象。由此可知:f1.proto === Foo.prototype。

prototype 作用:可以由特定类型的所有实例共享的属性和方法,也就是让该函数所实例化的对象们都可以找到公用的属性和方法。任何函数在创建的时候,其实会默认同时创建该函数的prototype对象。

constructor 属性

constructor 属性是对象才有的,它是从一个对象指向一个函数,含义就是指向该对象的构造函数。

总结

  1. __proto__和constructor 属性是对象所独有的;prototype 属性是函数所独有的,因为函数也是一种对象,所以函数也有__proto__和constructor 属性。
  2. __proto__属性的作用就是当访问一个对象的属性时,如果该对象内部不存在这个属性,那么就会去它的__proto__属性所指向的那个对象(父对象)里找,一直找,直到__proto__属性的终点null,再往上找就相当于在null上取值,会报错。通过__proto__属性将对象连接起来的这条链路即我们所谓的原型链。
  3. prototype 属性的作用就是让该函数所实例化的对象们都可以找到公用的属性和方法,即f1.proto === Foo.prototype。
  4. constructor 属性的含义就是指向该对象的构造函数。 所有函数(此时看成对象了)最终的构造函数都指向Function


图的说明:右下角为图例,红色箭头表示__proto__属性指向、绿色箭头表示prototype属性的指向、棕色实线箭头表示本身具有的constructor属性的指向,棕色虚线箭头表示继承而来的constructor属性的指向;蓝色方块表示对象,浅绿色方块表示函数(这里为了更好看清,Foo()仅代表是函数,并不是指执行函数Foo后得到的结果,图中的其他函数同理)。图的中间部分即为它们之间的联系,图的最左边即为例子代码。