面向对象之继承

继上篇博客 https://www.cnblogs.com/qianqian-it/p/9526634.html 简单介绍了有关call和apply的联系和区别之后,接下来我们来共同学习一下面向对象的三个基本特征之一继承

1  首先来分析一下什么是继承

  • 这里的继承和我们现实生活的中儿子继承父亲财产的这种关系虽然有相似的地方,但本质其实不一样;
  • 举一个简单的例子理解继承的含义: 猴子--会法术的猴子--孙悟空;
    • 会法术的猴子和猴子是我们这里所说的继承关系;
    • 会法术的猴子是猴子的一种,即猴子是会法术的猴子的类型;
    • 孙悟空是会法术的猴子的一个实例,即会法术的猴子是孙悟空的类;
    • 孙悟空即使会法术的猴子的一种,也是猴子的一种,这种关系就和我们接下来要讲的继承是一个道理;
    • 在程序里我们将猴子叫做父类(超类,基类),会法术的猴子是他的子类(子类型,派生类),会法术的猴子继承了猴子的所有特征;
    • 会法术的猴子是孙悟空的类;孙悟空是会法术的猴子的实例;
  • 一旦确定了两个类的继承关系,就包含以以三个意思:
    1. 子类的实例可以共享父类的方法
    2. 子类可以覆盖或扩展父类的方法
    3. 子类和父类都是子类实例的类型

2.继承的几种方式

实现继承的方式不止一种。这是因为 JavaScript 中的继承机制并不是明确规定的,而是通过模仿实现的。所以大家看参考书的时候会发现很多种实现继承    的方式,这里我们介绍最常用的几种。

  1. 对象冒充(构造函数绑定): 原理如下:使用对象冒充(call或apply方法)(实质上是改变了this指针的指向)继承基类。
  2. 原型链 这种方法更常见,使用prototype属性。
    • prototype 对象是个模板,要实例化的对象都以这个模板为基础。总而言之,prototype 对象的任何属性和方法都被传递给那个类的所有实例。原型链利用这种功能来实现继承机制。
    • 原型链的弊端是不支持多重继承。记住,原型链会用另一类型的对象重写类的 prototype 属性。
    • 子类的所有属性和方法都必须出现在 prototype 属性被赋值后,因为在它之前赋值的所有方法都会被删除。因为 prototype 属性被替换成了新对象,添加了新方法的原始对象将被销毁。
  3. 混合方式 我们曾经讲解过创建类的最好方式是用构造函数定义属性,用原型定义方法。这种方式同样适用于继承机制,用对象冒充继承构造函数的属性,用原型链继承 prototype 对象的方法

  一  .构造函数继承

无参数传递
    <script type="text/javascript">
      function Monkey(){
        this.type="猴子"
      }
      function Majic_monkey(){
        Monkey.call(this);//对象冒充
        this.skill="法术"
      }
      var wokong=new Majic_monkey();
    //再没有继承的情况下,wokong.type为undefind
有参数传递
    <script type="text/javascript">
    function Monkey(name,skill){
        this.name=name;
        this.skill=skill;
    }
    function Majic_monkey(){
        Monkey.call(this,"小米","杀人");
        this.tool="大刀"
    }
    var people=new Majic_monkey();
    alert(people.name+"使用了"+people.tool+"去"+people.skill)

    </script>
//弹出结果:小米使用了大刀杀人

二   原型链继承

    function Monkey(){}
    Monkey.prototype.name="猴子";
    Monkey.prototype.skill="偷桃";
    Monkey.prototype.fun=function(){
        alert(this.name+this.skill+"很开心");
    }

    function Majic_monkey(){};
    Majic_monkey.prototype=new Monkey();
   //将Majic_monkey实例指向了Monkey,Majic_monkey可以继承Monkey的属性和方法,同时也可覆盖Monkey的属性和方法
    Majic_monkey.prototype.name="孙悟空";
    var wokong=new Majic_monkey();
    alert(wokong.name);
    alert(wokong.skill)
    wokong.fun()
结果:

           

原型链继承只能是单继承,如果再Majic_monkey继承两个一个父类,则以最后一个父类为主,代码演示如下

  
  function Monkey(){}
    Monkey.prototype.name="猴子";
    Monkey.prototype.skill="偷桃";
    Monkey.prototype.fun=function(){
        alert(this.name+this.skill+"很开心");
    }
    function AA(){}
    AA.prototype={
            name:"小鱼",
            skill:"吐泡泡",
            fun:function(){
                alert(this.name+this.skill+"很开心");
            }
        }
    
    function Majic_monkey(){};
    Majic_monkey.prototype=new Monkey();//继承了Monkey
    Majic_monkey.prototype=new AA();//继承了AA
    var wokong=new Majic_monkey();
    alert(wokong.name);
    alert(wokong.skill)
    wokong.fun()

结果

       

三  混合模式继承

通过调用父类构造,继承父类的属性并保留传参的优点,然后通过将父类实例作为子类原型,实现函数复用

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术小黑屋

为什么局部变量需要显式设置初始化值

我们在编程中,无时无刻地都在于方法打交道,而在方法中,我们很难不使用局部变量,比如我们有下面的这样一段很简单的代码

1464
来自专栏web前端-

JavaScript运算符和控制语句

语法: switch(n)  {      case 1:      执行代码块 1      break;      case 2:      执行代码块 2...

842
来自专栏技术碎碎念

dom4j 使用总结

dom4j是一个Java的XML API,类似于jdom,用来读写XML文件 dom4j的使用方法简单总结来说如下: ①可以创建一个新的xml文件 ②利用SAX...

3918
来自专栏有趣的Python

算法与数据结构(二)附录:冒泡&插入&选择&希尔排序对比

冒泡排序 冒泡排序(Bubble Sort),是一种 计算机科学领域的较简单的 排序算法。 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误...

2794
来自专栏一个会写诗的程序员的博客

第11章 运算符重载与约定第11章 运算符重载与约定

我们在《第2章 Kotlin 语法基础》中已经学习过关于运算符的相关内容,本章将继续深入探讨Kotlin中的运算符的重载与约定。

1464
来自专栏一个会写诗的程序员的博客

Java 8中的Optional 类型与 Kotlin 中的可空类型Java 8中的Optional 类型与 Kotlin 中的可空类型Kotlin 中的可空类型《Kotlin极简教程》正式上架:

其中,我们使用 String? 同样表达了 Optional<String>的意思,相比之下,哪个更简单?

801
来自专栏web前端教室

javascript 红皮高程(12)

继续,今天是JS操作符。 要记住一点,ECMAScript的操作符可以适合于很多值,字符串,数字,布尔值,对象。但在应用于对象时,都会调用对象的valueOf(...

2156
来自专栏Golang语言社区

Golang中Interface类型详解

本文章翻译自《Let's learn Go》的“Interfaces: the awesomesauce of Go”一节 原文地址:http://go-boo...

4618
来自专栏一个会写诗的程序员的博客

《Kotlin极简教程》第四章 Kotlin基础语法表达式Null Check循环枚举遍历Map拼接字符串基本类型

在Kotlin中,所有东西都是对象,所以我们可以调用成员函数和属性的任何变量对象。有些类型是内置的,他们的实现被优化过, 但是用户看起来他们就像普通的类. 本节...

1753
来自专栏Java 技术分享

Java 基础 -- 泛型、集合、IO、反射

3649

扫码关注云+社区

领取腾讯云代金券