proto 和 prototype 区别

一、介绍#
proto( proto)#
在类似
java这种语言中,继承的概念是通过类和类之间实现的,但javascript根本没有类,都是对象,所以,在javascript中,继承的概念是通过对象和对象之间实现的。在考虑
javascript继承的时候,范围只限于引用数据类型,虽然引用数据类型分为Function和Object两种,但在继承问题上,不需要区分Function和Object,只需要统一看成对象即可。__proto__和prototype不同,prototype 只在 Function 中有,而__proto__则在Function和Object中都有。javascript 是通过__proto__来确定继承关系的 。javascript继承的本质: 一个对象 A的__proto__属性指向的那个对象B,B就是 A 的原型对象(或者叫父对象),对象 A 可以使用对象 B 中的属性和方法,同时也可以使用对象 B 的 原型对象C 上的属性和方法,以此递归,就是所谓的原型链。prototype#
一个
__proto__就实现了继承问题。那还要prototype做什么呢?prototype在继承中又起什么作用呢,其实prototype真正起作用的是在把Function当做构造函数使用的时候,因为__proto__并不是官方标准定义的属性,所以借助prototype属性来模仿类和类之间的继承模式。当通过
new关键字调用函数时,执行的是构造函数,它负责创建一个实例对象,把实例对象的__proto__属性指向构造函数的prototype来实现继承构造函数prototype的所有属性和方法,将this绑定到实例上,然后再执行函数体。
从上图我们可以找出foo对象和Foo函数的原型链:
1.foo对象原型链

2.Foo构造函数原型链

构造函数Foo的原型链上没有Foo.prototype,因此无法继承Foo.prototype上的属性和方法。而实例foo的原型链上有Foo.prototype,因此foo可以继承Foo.prototype上的属性和方法。
二、作用#
proto( proto):#
- 实现对象之间的继承,形成原型链。
- 使子辈对象可以使用父辈的属性和方法。
prototype:#
- 让该构造函数所实例化的对象们都可以找到公用的属性和方法( 即
foo.__proto__ === Foo.prototype)。 - 使
Javascript借助prototype属性来模仿实现类和类之间的继承模式。
- 让该构造函数所实例化的对象们都可以找到公用的属性和方法( 即
三、总结#
- proto
(和constructor属性)是**对象**所独有的;prototype属性是函数所独有的,因为函数也是一种对象,所以函数也拥有__proto__和constructor属性。 __proto__属性的作用就是当访问一个对象的属性时,如果该对象内部不存在这个属性,那么就会去它的__proto__属性所指向的那个对象(父对象)里找,一直找,直到__proto__属性的终点null。使子辈对象可以使用父辈的属性和方法。prototype属性的作用就是让该函数所实例化的对象们都可以找到公用的属性和方法,使Javascript借助prototype属性来模仿实现类和类之间的继承模式。