创建人类,教师类,学生类,分别通过三种不同的继承方式(原型继承,冒充继承,混合继承),总结优点缺点
作者:互联网
//首先创建一个教师类
function Teacher(name,age,course,professional){
this.name=name;
this.age=age;
this.course=course;//课程
this.professional=professional;//职业
}
Teacher.prototype.teaching=function(){//上课
console.log(this.name + this.professional +"正在上"+ this.course +"课");
}
var t1=new Teacher("张三",18,"语文","老师");
t1.teaching();//运行结果:张三老师正在上语文课
//在创建一个人类
function Human(name,age,course,professional){
}
//现在让人类继承教师类(原型链继承)
Human.prototype= new Teacher("赵六",24,"数学","老师");
Human.prototype.showInfo=function(){//信息
console.log(this.course+this.professional+this.name+"年龄"+this.age+"岁");
}
var h1=new Human();//没有传参
h1.showInfo();//运行结果:数学老师赵六年龄24岁
h1.teaching();//运行结果:赵六老师正在上数学课
//现在试试传参
var h2=new Human("孙七",42,"化学","老师");
h2.showInfo();//运行结果:数学老师赵六年龄24岁
//传参后并没有用,是因为在原型中对父级属性统一赋值了,这是原型链继承的缺点
//最后在创建一个学生类(混合继承(原型链继承和冒充继承))
function Student(name,age,course,professional){
//现在试一下学生类继承教师类(冒充继承)
Teacher.call(this,name,age,course,professional);
}
Student.prototype.learning=function(){//学习
console.log(this.professional + this.name + "正在学习" + this.course);
}
Student.prototype.play=function(){//玩
console.log(this.professional + this.name + "正在玩");
}
var s1=new Student("李四",8,"美术","学生");
s1.learning();//运行结果:学生李四正在学习美术
s1.play();//运行结果:学生李四正在玩
//现在测试一下学生有没有继承教师的上课teaching方法
//s1.teaching();报错了,说明没有继承到方法,这就是冒充继承的缺点,继承不到原型上的方法
//总结,原型继承既能继承到属性,也能继承到原型上的方法,但是继承的属性的值都是继承时确 定的,无法进行传参修改
// 冒充继承可以传参修改属性,但是无法继承父级原型上的方法
//所以现在要使用混合继承,构造函数内部采用冒充继承,构造函数外部采用原型继承(不传参,只继承原型上的方法)
//学生类继承教师类的方法(原型继承)
Student.prototype=new Teacher();
//再次测试学生类有没有继承教师的上课teaching方法
var s2=new Student("周八",9,"英语","学生");
s2.teaching();//运行结果:周八学生正在上英语课
//再试一下学生类继承人类的方法(原型继承)
Student.prototype=new Human();
var s3=new Student("吴九",10,"物理","学生");
s3.showInfo();//运行结果:物理学生吴九年龄10岁
标签:name,course,继承,冒充,原型,new,professional 来源: https://blog.csdn.net/weixin_44159525/article/details/119255755