JS--继承

继承

  • 出现在两个构造函数之间的关系
  • 当A构造函数的属性和方法被B构造函数的实例使用。则说明B继承了A的构造函数。A是B的父类、B是A的子类
    父类在这里插入图片描述

一、原型继承

  • 通过改变原型链的方式来达到继承

  • 子类.prototype = 父类的实例

  • 缺点:

    • 继承下来的属性没有在自己身上(在_proto_里面,访问时需要到_proto_里找)
    • 创建子类实例实例时无法向父类的构造函数传参
      原型链继承

    二、构造函数继承

  • 在子类的构造函数体内,借用父类构造函数执行,并强行让父类的构造函数的this指向子类的实例

  • 前提:

    • call()、apply()的应用:改变函数内部this
    • 将父类构造函数当成普通函数使用
  • 优点:

    • 继承的属性在自己身上
    • 在子实例中可向父实例传参
  • 缺点:

    • 只能继承属性,不能继承方法
      构造函数继承

三、组合继承

原型继承 + 构造函数继承

借用构造函数继承属性(还可以传参)

利用原型继承,继承父类的prototype

优点:

  • 可以以继承父类原型上的属性,可以传参,可复用
    缺点:
  • 子类原型上本来的方法没有了,必须要继承后再添加
  • 调用了两次父类构造函数(耗内存)
    组合继承

四、 ES6继承语法

类 class

  • class 可以理解为function,由于class本质还是一个function,因此它也会拥有一个的prototype属性,当new一个class时,会把class的porototype属性赋值给这个新对象的 __proto属性。

constructor

  • constructor 方法是默认添加的方法,在new一个对象时,自动调用该方法,constructor里面定义自己的属性。

继承extends和super,class 子类名 extends 父类名实现继承,当然还得在constructor里面写上super(父类的参数),意思就是在子类中获得父类的this指针,相当于Animal.call(this)

// es6继承
  class Animal {
    //构造函数,里面写上对象的属性
    constructor(props) {
      this.name = props.name || 'Unknown';
    }
    //方法写在后面
    eat() {//父类共有的方法
      console.log(this.name + " will eat pests.");
    }
  }

  //class继承
  class Bird extends Animal {
    //构造函数
    constructor(props,myAttribute) {//props是继承过来的属性,myAttribute是自己的属性
      //调用实现父类的构造函数
      super(props)//相当于获得父类的this指向
      this.type = props.type || "Unknown";//父类的属性,也可写在父类中
      this.attr = myAttribute;//自己的私有属性
    }

    fly() {//自己私有的方法
      console.log(this.name + " are friendly to people.");
    }
    myattr() {//自己私有的方法
      console.log(this.type+'---'+this.attr);
    }
  }

//通过new实例化
  var myBird = new Bird({
    name: '小燕子',
    type: 'Egg animal'//卵生动物
  },'Bird class')
  myBird.eat()
  myBird.fly()
  myBird.myattr()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值