原型prototype

只有构造函数有的一个属性(prototype),并且为对象类型
为了在javascript中实现继承而出现的产物

proto

所有对象都拥有的属性,指向该对象对应的原型对象

概念看完直接上图

情况一:使用构造函数创建对象

image.png
当我们创建一个Father构造函数,并且new一个对象时

  1. function Father(){
  2. this.name = "father";
  3. }
  4. var father = new Father();

father中的__proto__指向Father.prototype
Father.prototype中也包含了__proto__属性,指向Object.prototype

当我们访问father.name时,如果自身没有属性
会顺着__proto__找向Father.prototype,依然没有,
会继续顺着Father.prototype.__proto__找向Object.prototype
直到找向Object.prototype.__proto__时,值为null。

情况二:修改原型

image.png
当我们将Son原型修改为father对象时Son.prototype = new Father()

  1. Son.prototype = new Father();
  2. function Son(){
  3. this.name = "son";
  4. }
  5. var son = new Son();

其中son.__proto__指向Son.prototype也就是new Father()
当访问son.name时,如果没有则会顺着son.__proto__找向new Father()
依然没有则会找向Father.prototype依次向上

以上两种情况便构成了原型链

特殊情况:

Object.proto===Function.prototype
Function.proto===Function.prototype