【面向对象】用大白话扯扯那"神奇"的面向对象之方法继承(五)------【巷子】

001原型链

什么是原型链?
     解释:由__proto__形成的链条叫做原型链

     假设我们创建了一个Person这个构造函数,然后实例化出一个对象fanchen,当我们输出这个实例化对象的时候,这个实例化对象里面有一个__proto__属性,这个__proto__属性指向的是创建自己的那个构造函数的原型,也就是说这个实例化对象的__proto__指向的是Person里面的prototype这个原型对象,因为prototype是一个对象因此里面肯定也会有一个__proto__。而这个__proto__指向的是创建Person这个构造函数的对象,可以想象一下谁创建了Person?这个时候我们就不得不说一句"万物皆是对象".肯定是一个对象创建了Person。而这个对象就是 Function。有对象那么肯定就会有__proto__.那么我们可以想象一下还有什么可以创建出来对象吗?因此对象的顶端也就是null.接下来我们用案例和内存图详细的解释一波

       

       

 

 

总结:
     原型链:由__proto__形成的链条
          Object里面的__proto__指向的是null

 002方法继承

继承:
     在上一章我们说了属性继承,接下来我们继续说下方法继承。方法的继承分为好多种,接下来我们逐个分析来找出一种最完美的继承方式

     首先我们还是回顾一下属性继承,我们先写一个构造函数Person。然后再创建1个实例化对象fanchen

 

 

 现在我们可以继承到父级的属性了,但是貌似父级的方法继承不了,因为我看到__proto__里面只有一个work这个方法。那么我们如何继承父级的方法呢?我们可以试想一样fanchen是如何访问到work这个方法的?因为实例化对象里面的__proto__指向是创建自己的那个构造函数的原型对象因此可以访问。那么如果现在我用Man的原型对象指向Person的原型对象会发生什么?

 1、原型继承

Man的原型对象指向Person的原型对象
 

 

貌似是可以的,但是这个原理是什么呢?同时注意一下上面的constructor的指向。接下来我们画一个内存图来解释一下原理和弊端。

从上面的内存图中我们不难看出当Man的原型指向Person的原型的时候首先Man的原型对象断掉了,随后我们又给Man的原型添加了方法work,这个时候你会发现Man的work方法加到了Person身上。这样肯定是不行的,因为我们怎么能修改父级的原型对象呢?顺便我们可以在打印出来父级的原型看一下

 

因此这个原型继承肯定是不行的,那么接下来我们说下原型继承缺点
 
缺点:子类原型发生改变父类原型也会发生改变

 2、原型拷贝

上面的方法肯定不是特别合理的,那么我们可以想一下既然不能直接将Man的原型指向Person的原型,那么我们可不可将Person里面原型对象的属性直接拷贝一份,这样我就不会直接修改到父级的原型了?
废话少说直接上代码

  

貌似特别完美,接下来我们在查看一下父级有没有发生改变

真的没有什么问题啊。那么接下来我们通过内存图来查看下原理及缺点

 

 

从内存图中可以看出我们的Man只是拷贝了一份Person的方法,然后Man里面的方法的指向还是指向Person的里面方法的原型。随后我们又在Man上面添加了一个work方法。这样我们既不会污染Person也能实现了继承,但是缺点也显而易见了
 
缺点:假设Person上面还有父级  那么我们的Man是无法访问到Person父级的原型上的方法

 3、原型链继承

从上一章我们讲的原型链可以知道,我们可以通过原型链访问父级以及父父级里面的一些属性和方法,那么我们利用这个特点可以将Man的原型对象指向Person的一个实例.因为实例里面肯定是有一个__proto__,这样的话我们就形成了一个原型链。接下来我们用案例和内存图来表示

  

  

  当打印出来的时候确实可以看到父级的方法也可以进行访问,但是有缺点,大家不难发现Man的__proto__里面多了几个age name sex  而且值还是undefined?

 4、混合继承

从上面的原型链继承可以看出,当打印出来fanchen的时候我们丢失了一个constructor属性而且还有好多杂乱的属性,那么我们应该如何解决呢?我们一步一步来
  

  

这时候你就会发现终于实现了完美继承。


 5、寄生继承

在网上会经常见到一种方法叫做寄生继承。其实看到名字你也能想的到,一定需要一个类似寄生器一样的东西。其实就是一个中间函数
 

 

 

 


 

posted @ 2017-12-01 16:40  Alley-巷子  阅读(989)  评论(0编辑  收藏  举报