何为prototype,__proto__
prototype被称为原型。只有在函数对象上才有的属性。即在申明一个函数的时候,同时会有一个peototype的属性对象生成。
__proto__被称为构造函数的原型,即a.constronctor.prototype这样。
何为原型连
想一想通过函数我们可以访问内部的属性或者方法,当内部不存在的时候,我们可以访问到其原型的上的属性方法,以及其原型的构造函数的原型,一直到object.prototype.__proto__,也就是null的时候,会返回undefined.
所以整个过程就形成了一条原型链。简单的说就是从当前函数查找对应的属性方法,一直沿着原型链查找对应的属性方法,找到就返回对应的值,找不到就一直到顶层object.prototype.__proto__,那就是undefined.
原型链的继承
看下面的代码
这里我们利用原型实现了一个简单的继承。
但是会有一些问题。
我们发现函数是没有参数的,如果要传入参数的话,那么就想不通了。
同时我们打印下B.prototype.constructor看看,
好吧,我们发现打印的是A函数,没错,通过改变原型,原型的构造函数也同时被改变,所以我们可以强制在改变回来.
好的,现在看起来好像要正常一点了。下面我们是不是要来解决刚才的参数问题。
我们知道call,apply,bind都能改变this指向,同时传入对应的参数.我们用apply来实现。
重写代码后看到,现在可以传入参数了,看起来现在的继承很不错。这就是组合继承。
好的,我们实现了一个继承,我们再看看prototype除了继承外到底还有什么用。
利用prototype优化函数的性能.
一个函数拥有一个prototype属性,在原型链的作用下,我们可以将我们的属性方法声明在原型上,从而也可以拿到其值。
很多时候我们可以合理的将方法属性绑定到prototype上。
至于为什么,我们数据说话。
如果我们初始申明大量的属性方法,那么我们在new的这个过程将会消耗一部分时间。
而如果我们申明到原型上:
我们发现时间初始化要快很多
所以我们应该尽可能的将一些属性方法绑定到prototype上,