_ proto_、prototype 和 constructor之间的关系
两个实例是对象,构造函数是函数,每个对象都有_ proto _ 属性,即[[prototype]]属性,每一个函数都有prototype属性,这个属性指向一个对象,即每一个实例的原型对象。
1._ proto _ 属性
_ proto _ 属性和constructor属性都是对象所独有的,prototype属性是函数独有的,函数在js当中又属于对象,所有函数同时拥有这三个属性。
上图中,f1是一个实例对象,它的原型对象是构造函数的prototype属性指向的那个对象,而这个原型对象又指向他自己的原型对象,_ proto _ 属性的作用是从一个对象指向另一个对象,旨在寻找对象属性时,如果在本身无法找到该属性,就一级一级的向上查找,就这样构成了原型链。
其实,我们平时使用的字符串方法、对象方法等都是通过_ proto _ 属性继承而来的。
2.prototype属性
每一个函数都有prototype属性(因为每一个函数都可以作为构造函数),从一个函数指向一个对象,它的作用是让该函数所创建的所有实例化的对象都有公用的属性和方法,在创建该函数的时候,就同时创建了该函数的prototype属性所对应的对象。
3.constructor属性
constructor属性是对象独有的,**它的作用是从一个对象指向一个函数,即指向该对象的构造函数。**Function对象的构造函数就是他自己,所有对象和函数都是由Function这个构造函数得来。
每个函数创建的时候,js会同时创建一个该函数的prototype属性对应的对象,这个对象就是该函数创建的每一个实例的原型对象。实例._ proto _ 属性 = 函数.prototype ,函数.prototype.constructor = 该函数本身。
只有prototype对象才有constructor属性,但是其他的对象可以通过继承找到它对应的构造函数,如f1。
4.总结
1)_ proto _ 属性是对象独有的,prototype属性是函数独有的,因为函数在js中也是对象,所以它拥有以上三种属性。
2)_ proto _ 属性的作用是:通过一个对象指向一个对象,进而实现js中的原型链查找。
3)prototype属性的作用是:在函数上定义一个原型对象,使得该函数创建的所有实例都具有共同的属性和方法。
4)constructor属性的含义就是指向对象的构造函数,所有对象的构造函数最终都指向Function。