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

    在网上会经常见到一种方法叫做寄生继承。其实看到名字你也能想的到,一定需要一个类似寄生器一样的东西。其实就是一个中间函数
       
    
    
  • 相关阅读:
    迁移博客到Github Pages
    局域网传输文件的一点研究
    0CTF 2017 部分Web的某些不一样的思路
    WPScan初体验
    几种语言的CGI编程
    博客园站内短消息XSS
    nc分析代理服务器
    一个PHP混淆后门的分析
    瘟疫公司中国版(Android)手动破解内购
    参加 Tokyo Westerns / MMA CTF 2nd 2016 经验与感悟 TWCTF 2016 WriteUp
  • 原文地址:https://www.cnblogs.com/nanianqiming/p/7943207.html
Copyright © 2011-2022 走看看