js继承种类

 
  • 原型链继承
继承首先要有父类 ,创建一个父类
function Animal(name){
 this.name=name||"Animal"
 this.sleep=function(){
    console.log(this.name+"睡觉")
}
 
}
Animal.prototype.eat=function(foot){
console.log(this.name+"吃东西"+foot)
}
// 狗狗类
function Dog(){
this.size
 
}
Dog.prototype=new Animal();
Dog.prototype.constructor = Dog;
//小猪类
 
function Pig(){
}
Pig.prototype=new Animal();
// 一头猪
var pigone=new Pig()
// 一只狗,
var dogone=new Dog()
dogone.prototype.name="花花"
pigone.prototype.name="猪猪" //错误的,无法向构造函数传参数
 
dogone.eat("骨头")
dogone.sleep()
pigone.eat("饲料")
pigone.sleep()
 
 
console.log(dogone instanceof Animal)
console.log(dogone instanceof Dog)
 
特点:
  1. 非常纯粹的继承关系,实例是子类的实例,也是父类的实例
  2. 父类新增原型方法/原型属性,子类都能访问到
  3. 简单,易于实现
  4. 在父类新增的方法和属性,在任何一个子类事列中都可以访问,每个子类只能访问自己子类的方法和属性,不能访问
  5.  
缺点:
 
1.创建子类实例时,无法向父类构造函数传参
2. 来自原型对象的所有属性被所有实例共享 ( 父类中私有的和公有的都继承到了子类原型上(
 
  • call继承(构造继承)

function Animal(name){

 this.name=name||"Animal"

 this.sleep=function(){

    console.log(this.name+"睡觉")

}

 

}

Animal.prototype.eat=function(foot){

console.log(this.name+"吃东西"+foot)

}

function Dog(name){

    Animal.call(this)

    this.name = name

}

var dogone=new Dog('花花')

dogone.sleep()

dogone.eat("骨头") //这个在原型链上面,无法继承。继承的是父类中的this指示下的属性和方法

特点:

  1. 解决了1中,子类实例共享父类引用属性的问题
  2. 创建子类实例时,可以向父类传递参数
  3. 可以实现多继承(call多个父类对象)

缺点:

  1. 实例并不是父类的实例,只是子类的实例
  2. 只能继承父类的实例属性和方法,不能继承原型属性/方法
  3. 无法实现函数复用,每个子类都有父类实例函数的副本,影响性能
  • 3.拷贝继承
核心:使用父类的构造函数来增强子类实例
特点:把父类私有的和公有的克隆一份一样的给子类
function Animal(name){
 this.name=name||"Animal"
 this.sleep=function(){
    console.log(this.name+"睡觉")
}
 
}
Animal.prototype.eat=function(foot){
console.log(this.name+"吃东西"+foot)
}
function Dog(name){
    var temp = new Animal(name)
    for(var k in temp){
        this[k] = temp[k]
    }
    Dog.prototype.name = name || '狗狗';
}
var dogone=new Dog('花花')
dogone.sleep()
dogone.eat("骨头") //
var pig=new Dog('等待')
pig.sleep()
pig.eat("骨头") 
缺点:
  1. 效率较低,内存占用高(因为要拷贝父类的属性)
  2. 无法获取父类不可枚举的方法(不可枚举方法,不能使用for in 访问到)
  • 原型链+call构造继承
  • function Animal(name){
     this.name=name||"Animal"
     this.sleep=function(){
        console.log(this.name+"睡觉")
    }
     
    }
    Animal.prototype.eat=function(foot){
    console.log(this.name+"吃东西"+foot)
    }
    function Dog(name){
        Animal.call(this)
        this.name=name||'狗狗'
    }
    Dog.prototype=new Animal()  
    Dog.prototype.constructor = Dog;
    var dogone=new Dog('花花')
    dogone.sleep()
    dogone.eat("骨头") 
    var pig=new Dog('等待')
    pig.sleep()
    pig.eat("骨头") 
    console.log(dogone.name)
    特点:
    1. 弥补了方式2的缺陷,可以继承实例属性/方法,也可以继承原型属性/方法
    2. 既是子类的实例,也是父类的实例
    3. 不存在引用属性共享问题
    4. 可传参
    5. 函数可复用
    缺点:
    1. 调用了两次父类构造函数,生成了两份实例(子类实例将子类原型上的那份屏蔽了)
    寄生组合继承
  • function Animal(name){
     this.name=name||"Animal"
     this.sleep=function(){
        console.log(this.name+"睡觉")
    }
     
    }
    Animal.prototype.eat=function(foot){
    console.log(this.name+"吃东西"+foot)
    }
    function Dog(name){
        Animal.call(this)
        this.name=name||'狗狗'
    }
    Dog.prototype = createObject(Animal.prototype)
    Dog.prototype.constructor = Dog;
    function createObject(o){
        function fn(){}
        fn.prototype = o;
        return new fn;
    }
    var dogone=new Dog('花花')
    dogone.sleep()
    dogone.eat("骨头") 
    var pig=new Dog('等待')
    pig.sleep()
    pig.eat("骨头") 
    console.log(dogone.name)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章