创建人类,教师类,学生类,分别通过三种不同的继承方式(原型继承,冒充继承,混合继承),总结优点缺点

//首先创建一个教师类 

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岁

 

 

上一篇:pycharm-professional-2021.1.3卡bug无限次重置试用时间


下一篇:创建简单的学生管理系统