版权声明:我的博客我做主! https://blog.csdn.net/lk1822791193/article/details/82769026
前言
虽然js是一种面向对象的弱类型语言,但是它的继承性也非常的强大的!
其实在前边的原型与原型链的时候,我已经说到了继承(改变原型指向),但是并不全面,所以今天给大家介绍其他继承方式!
代码
<script>
function Person(age,sex,name){
this.age= age;
this.sex= sex;
this.name= name;
}
Person.prototype.play=function(){
console.log("play baskerball");
}
//prototype inheritance
//原型链继承
function SmallStudent(study){
this.study=study;
}
SmallStudent.prototype=new Person(12,"man","Eric");
SmallStudent.prototype.haveclass=function(){
console.log("study class");
}
var sstu = new SmallStudent(100);
sstu.play();
sstu.haveclass();
console.log(sstu);
//contructor inheritance
//构造函数继承
function BigStudent(smile,age,sex,name){
Person.call(this,age,sex,name);
this.smile=smile;
}
var bstu =new BigStudent(20,"man","Divde","haha");
console.log(bstu.smile)
//example inheritance
//实例继承
function Student1(name){
var stu1 =new Person();
stu1.name=name || "Tom";
return stu1;
}
var stu1 =new Student1();
console.log(stu1.name);
console.log(stu1.play);
//group inheritance(contructor and prototype inheritance)
//组合继承
function Teacher(smile,age,sex,name){
Person.call(this,age,sex,name);
this.smile=smile;
}
Teacher.prototype=new Person();
var teacher =new Teacher(25,"women","Admin","haha");
console.log(teacher.age,teacher.sex,teacher.name,teacher.smile);
teacher.play();
//copies of the inheritance
//深复制继承
var s1={};
for(var key in teacher){
s1[key]=teacher[key]
};
console.dir(s1.age);
s1.play();
//浅复制继承
var s2=teacher;
console.dir(s2.age);
s2.play();
</script>
对比
继承名称 | 继承方式 | 优点 | 缺点 |
原型链继承 | 改变原型指向 | 1.可以继承新指向的属性和方法 2.简单,易于实现 |
1.所有属性都初始化,无法修改 2.无法实现多继承 3.创建子类实例时,无法向父类构造函数中传参 |
构造函数继承 | 调用其他构造函数 function name.call(this) |
1.解决了原型继承所有属性都初始化的问题 2.创建实例时,可以向父类传递参数 3.可以实现多继承 |
1.无法继父类的方法和实例属性 2.无法实现函数复用 |
实例继承 | 为父类添加新特性 作为子类实例返回 |
1.不限制调用方式 |
1.实例是父类的实例 2.不支持多继承 |
组合继承 | 原型继承+构造函数继承 | 1.集合了它俩的优点 2.解决了它俩的问题 |
1.调用了两次父类的构造函数 2.生成了两份实例 |
浅复制继承 (拷贝继承) |
指针拷贝 | 1.方便快捷 | 1.一个对象修改所有拷贝的内容都会随之修改 (牵一发而动全身) |
深复制继承 (拷贝继承) |
把一个对象中的属性和方法 通过循环遍历的方式 拷贝到一个新的对象当中 |
1.支持多继承 | 1.效率比较低 2.无法获取父类的枚举方法 |
简单总结分享,有什么问题欢迎大家和我交流,感谢大家认真阅读和点赞鼓励!