js中继承的六种方式

1.原型链继承

原型链继承Javascript实现继承的基本思想,通过原型链将一个引用类型继承另一个引用类型的属性和方法

  //定义一个动物类
   function Animal(name){
      //实例属性
      this.name=name||'Animal'
      //实例方法
      this.sleep=function(){
        console.log(this.name+'正在睡觉')//cat正在睡觉
      }
    }
    //原型方法
    Animal.prototype.eat=function(food){
      console.log(this.name+'正在吃:'+food)//cat正在吃:fish
    }
   //原型链实现继承
    //介绍:可看到new了一个空对象,这个空对象指向Animal并且Cat.prototype指向了这个空对象,这就是基于原型链的继承
    //特点基于原型链,既是父类的实例,也是子类的实例
    //缺点无法实现多继承
    function Cat(){}
    Cat.prototype=new Animal()
    Cat.prototype.name='cat'
    var cat=new Cat()
    console.log(cat.name)//cat
    console.log(cat.eat('fish'))//undefined
    console.log(cat.sleep())//undefined
    console.log(cat instanceof Animal)//true
    console.log(cat instanceof Cat)//true

2.借用构造函数继承(伪造对象或经典继承)

Javascript实现继承的基本思想:在子类构造函数内部调用超类型构造函数。通过使用apply和call方法可以在新创建的子类对象上执行构造函数

 //定义一个动物类
    function Animal(name){
      //实例属性
      this.name=name||'Animal'
      //实例方法
      this.sleep=function(){
        console.log(this.name+'正在睡觉')//Tom在睡觉
      }
    }
    //原型方法
    Animal.prototype.eat=function(food){
      console.log(this.name+'正在吃:'+food)
    }
   //构造继承:使用父类的构造函数来增强子类实例,等于是复制父类的实例属性给子类(没用到原型)
   //特点:可以实现多继承
   //缺点:只能继承父类实例的属性和方法,不能继承原型上的属性和方法
   function Cat(name){
     Animal.call(this)//改变this指向,此时this指向
     this.name=name||'Tom'
   }
   var cat=new Cat()
   console.log(cat.name)//Tom
   console.log(cat.sleep())//undefined
   console.log(cat instanceof Animal)//false
   console.log(cat instanceof Cat)//true

3.组合继承(原型+借用构造函数)

Javascript实现继承的基本思想;将原型链和借用构造函数技术组合在一块,从而开发两者之长的一种计继承模式,将原型链和借用构造函数技术组合到一起,从而取长补短发挥两者长处的一种继承模式

//定义一个动物类
   function Animal(name){
      //实例属性
      this.name=name||'Animal'
      //实例方法
      this.sleep=function(){
        console.log(this.name+'正在睡觉')//Tom正在睡觉
      }
    }
    //原型方法
    Animal.prototype.eat=function(food){
      console.log(this.name+'正在吃:'+food)//cat正在吃:fish
    }
   //组合继承:相当于构造继承和原型链继承的组合体。通过调用父类构造,继承父类的属性并保留传参的优点,然后通过将父类实例作为子类原型,实现函数复用
   //特点:调用了两次父类构造函数,生成了两份实例
   function Cat(name){
     Animal.call(this)
     this.name=name||'Tom'
   }
   Cat.prototype=new Animal()
   Cat.prototype.constructor=Cat
   var cat=new Cat()
   console.log(cat.name)//Tom
   console.log(cat.sleep())//undefined
   console.log(cat instanceof Animal)//true
   console.log(cat instanceof Cat)//true

4.型式继承

借助原型可以基于已有的对象创建新对象,同时还不必须因此创建自定义的类型

5.寄生式模式

创建一个仅用于封装继承过程的函数,该函数在内部以某种方式来增强对象,最后再想真正是它做了所有工作一样返回对象,寄生式继承是原型继承的加强版

6.寄生组合式继承

通过借用函数来继承属性,通过原型链的混合形式来继承方法

 //定义一个动物类
   function Animal(name){
      //实例属性
      this.name=name||'Animal'
      //实例方法
      this.sleep=function(){
        console.log(this.name+'正在睡觉')//Tom正在睡觉
      }
    }
    //原型方法
    Animal.prototype.eat=function(food){
      console.log(this.name+'正在吃:'+food)//cat正在吃:fish
    }
   //寄生组合继承;通过寄生方式,砍掉父类的实例属性,这样,在调用两次父类的构造的时候,就不会初始化两次实例方法/属性
  function Cat(name){
    Animal.call(this)
    this.name=name||'Tom'
  }
  (function(){
    //创建一个没有实例方法的类
    var Super=function(){}
    Super.prototype=Animal.prototype
    //将实例作为子类的原型
    Cat.prototype=new Super()
  })()
  var cat=new Cat()
  console.log(cat.name)//Tom
  console.log(cat.sleep())//undefined
  console.log(cat instanceof Animal)//true
  console.log(cat instanceof Cat)//true
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值