欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

原型继承,借用构造函数继承,组合继承和拷贝继承

程序员文章站 2022-03-08 20:23:40
...

原型继承: 为了数据共享,改变原型指向,做到了继承,通过改变原型指向实现的继承。

    //动物的构造函数
    function Animal(name,weight) {
      this.name=name;
      this.weight=weight;
    }
    //动物的原型的方法
    Animal.prototype.eat=function () {
      console.log("天天吃东西,就是吃");
    };

    //狗的构造函数
    function Dog(color) {
      this.color=color;
    }
    Dog.prototype=new Animal("哮天犬","50kg");
    Dog.prototype.bitePerson=function () {
      console.log("哼~汪汪~咬死你");
    };

    //哈士奇
    function ErHa(sex) {
      this.sex=sex;
    }
    ErHa.prototype=new Dog("黑白色");
    ErHa.prototype.playHost=function () {
      console.log("哈哈~要坏衣服,要坏桌子,拆家..嘎嘎...好玩,开心不,惊喜不,意外不");
    };
    var erHa=new ErHa("雄性");
    console.log(erHa.name,erHa.weight,erHa.color);
    erHa.eat();
    erHa.bitePerson();
    erHa.playHost();

原型继承缺陷: 因为改变原型指向的同时实现继承,直接初始化了属性,继承过来的属性的值都是一样的,所以,这就是问题。如果想不一样,只能重新调用对象的属性进行重新赋值。

解决方案: 继承的时候,不用改变原型的指向,直接调用父级的构造函数的方式来为属性赋值就可以了------借用构造函数:把要继承的父级的构造函数拿过来,使用一下就可以了
借用构造函数: 构造函数名字.call(当前对象,属性,属性,属性…);
解决了属性继承,并且值不重复的问题
缺陷: 父级类别中的方法不能继承

 //借用构造函数继承
 function Person(name, age, sex, weight) {
      this.name = name;
      this.age = age;
      this.sex = sex;
      this.weight = weight;
    }
    Person.prototype.sayHi = function () {
      console.log("您好");
    };
    function Student(name,age,sex,weight,score) {
      //借用构造函数
      Person.call(this,name,age,sex,weight);
      this.score = score;
    }
    var stu1 = new Student("小明",10,"男","10kg","100");
    console.log(stu1.name, stu1.age, stu1.sex, stu1.weight, stu1.score);
    
	//如果调用方法的话会报错   借用构造函数继承的方法不能继承
	//stu1.sayHi()//报错
    var stu2 = new Student("小红",20,"女","20kg","120");
    console.log(stu2.name, stu2.age, stu2.sex, stu2.weight, stu2.score);

    var stu3 = new Student("小丽",30,"妖","30kg","130");
    console.log(stu3.name, stu3.age, stu3.sex, stu3.weight, stu3.score);

组合继承: 原型继承和构造函数继承组合使用,发挥两者之长的一种继承方式。
原型继承虽然属性和方法都能继承,但是继承的时候初始化了属性,继承过来的属性的值都是一样的。构造函数继承只能解决了属性继承都是一样的问题,并且值不重复,但是父级类别中的方法不能继承。使用组合继承,属性和方法都能继承。

注意:使用组合继承,在改变原型指向的时候,就不用传入参数了

    //     组合继承
    function Person(name,age,sex) {
      this.name=name;
      this.age=age;
      this.sex=sex;
    }
    Person.prototype.sayHi=function () {
      console.log("你好啊");
    };
    function Student(name,age,sex,score) {
      //借用构造函数:属性值重复的问题
      Person.call(this,name,age,sex);
      this.score=score;
    }
    //改变原型指向----继承
    Student.prototype=new Person();//不传值
    Student.prototype.eat=function () {
      console.log("吃东西");
    };
    var stu=new Student("小黑",20,"男","100分");
    console.log(stu.name,stu.age,stu.sex,stu.score);
    stu.sayHi();
    stu.eat();
    var stu2=new Student("小白",30,"女","101分");
    console.log(stu2.name,stu2.age,stu2.sex,stu2.score);
    stu2.sayHi();
    stu2.eat();

拷贝继承: 把一个对象中的属性或者方法直接复制到另一个对象中

   var obj1={
     name:"小糊涂",
     age:20,
     sleep:function () {
       console.log("睡觉了");
     }
   };

   var obj2={};
   for(var key in obj1){
     obj2[key]=obj1[key];
   }
   console.log(obj2.name);
相关标签: 继承