zoukankan      html  css  js  c++  java
  • 【面向对象】面向对象之方法继承(五)

    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、寄生继承

    复制代码
    在网上会经常见到一种方法叫做寄生继承。其实看到名字你也能想的到,一定需要一个类似寄生器一样的东西。其实就是一个中间函数
       
    
    
     
  • 相关阅读:
    第二节:依赖倒置原则和单一职责原则
    第一节:开闭原则和里氏替换原则
    leetcode 110 Balanced Binary Tree
    leetcode 102 Binary Tree Level Order Traversal
    leetcode 101 Symmetric Tree
    【产品】张小龙--微信背后的产品观
    【ML】目标检测及跟踪
    【设计】信息卡片设计
    【指标】游戏指标定义
    【GIT】windows本机搭建GIT服务器
  • 原文地址:https://www.cnblogs.com/liuhaov/p/13492555.html
Copyright © 2011-2022 走看看