继承的几种方式

js继承的几种方式:原型继承,借用构造函数继承,组合继承(原型继承+借用构造函数继承),拷贝继承

原型继承

function Animal(name,weight){
    this.name=name;
    this.weight=weight;
};

Animal.prototype.eat=function(){
    console.log("我是Animal构造函数的eat方法")
};

function Dog(color){
    this.color=color
};

Dog.prototype=new Animal("哮天犬","50kg");   //原理:通过改变原型指向实现继承,优缺点:可以很好的继承方法(如这里的eat方法),但不能很好的继承属性(如这里的name,weight,color)
let smallDog=new Dog("黑色");
smallDog.eat();

借用构造函数继承

function Animal(name,weight){
    this.name=name;
    this.weight=weight;
};

Animal.prototype.eat=function(){
    console.log("我是Animal构造函数的eat方法")    
}

function Dog(color,name,weight){   //这里也需要传入借用的构造函数里的属性,这里指Animal构造函数的属性也要传入
    this.color=color;
    Animal.call(this,name,weight);   //借用构造函数继承,需要使用到call语法。优缺点:可以很好的继承属性(如name,weight,color),但不能很好地继承方法(如eat)
        //借用构造函数格式:借用构造函数:构造函数名字.call(当前对象,属性,属性,属性....);
}
let smallDog=new Dog("哮天犬","50kg","黑色");
console.log(smallDog.name,smallDog.weight,smallDog.color);
smallDog.eat();  //这句代码会报错,因为借用构造函数继承并没有继承到Animal构造函数的eat方法,故不能调用

组合继承(结合了原型继承和借用构造函数继承)

function Animal(name,weight){
    this.name=name;
    this.weight=weight;
};

Animal.prototype.eat=function(){
    console.log("我是Animal构造函数的eat方法")    
}

function Dog(color,name,weight){
    this.color=color;
    Animal.call(this,name,weight);   //借用构造函数继承
}

Dog.prototype=new Animal();  //原型继承,**注意,组合继承的话这里不需要传值,因为这里的原型继承是用来继承方法的,不用考虑属性**
let smallDog=new Dog("哮天犬","50kg","黑色");   
console.log(smallDog.name,smallDog.weight,smallDog.color);  //通过"借用构造函数继承"继承了属性
smallDog.eat();  //通过"原型继承"继承了方法
 

拷贝继承(将一个对象中的属性和方法通过循环遍历放在另一个对象中)

function Person() {

 }
Person.prototype.age=10;
Person.prototype.sex="男";
Person.prototype.play=function () {
   console.log("玩的好开心");
 };

var obj2={};   

for(var key in Person.prototype){    //通过循环遍历的方法将Person.prototype里的方法放入obj2中
      obj2[key]=Person.prototype[key];
 }
console.dir(obj2);   //consolew.dir() 打印一个对象的所有属性和方法
obj2.play();

总结:

面向对象特性:封装,继承,多态
继承,类与类之间的关系,面向对象的语言的继承是为了多态服务的,
js不是面向对象的语言,但是可以模拟面向对象.模拟继承.为了节省内存空间
原型作用: 数据共享 ,目的是:为了节省内存空间,
原型作用: 继承 目的是:为了节省内存空间

继承:
  • 原型继承(改变原型的指向,主要继承方法,不能很好的继承属性)
  • 借用构造函数继承(主要解决属性继承的问题,但不能很好的继承方法)
  • 组合继承:原型继承+借用构造函数继承(既能解决属性问题,又能解决方法问题)
  • 拷贝继承(就是把对象中需要共享的属性或者方法,直接遍历的方式复制到另一个对象中)
posted @ 2019-08-06 17:55  huihuihero  阅读(213)  评论(0编辑  收藏  举报