继承(6种方式)以及优缺点

简介: 继承(6种方式)以及优缺点

1.原型链继承

2.构造函数继承

3.组合继承(原型链继承+构造函数继承)

4.原型式继承

5.寄生继承

6.组合寄生继承


代码示例:

//借助构造函数实现继承:缺点是父构造函数的原型链继承不了,若要全部继承除非将所有属性和方法定义在构造函数中
function Parent1 () {
  this.name = 'parent1';
}
function Child1 () {
  //这么做的好处是定义在父构造函数中的引用类型的属性,对于子构造函数的每个实例来说是独立的
  //并且在子构造函数实例化时,可以给父构造函数传参
  Parent.call(this);
  this.type = 'child1';
}
//借助原型链实现继承:缺点是继承的引用类型属性是共享的,子构造函数的实例更改会影响其他实例上的这个属性,比如 play 属性
function Parent2 () {
  this.name = 'parent2';
  this.play = [1, 2, 3];
}
function Child2 () {
  this.type = 'Child2';
}
Child2.prototype = new Parent2();
//组合方式:缺点是会执行两次父构造函数
function Child3 () {
  //执行第一次
  Parent2.call(this);
  this.type = 'Child3';
}
Child3.prototype = new Parent2(); //执行第二次
//组合优化1,不需要再将定义在父构造函数中的属性和方法再继承一次,只需要继承原型链上的
Child3.prototype = Parent2.prototype;
//缺点是无法区分一个实例是子函构造函数实例化的还是父构造函数实例化的
let s1 = new Child3();
//s1.constructor 指向了 Parent2,而不是 Child3,因为 Child3 原型对象的属性 constructor 继承了 Parent2 原型对象上的
//如果你强行执行 Child3.prototype.constructor = Child3 的话,也会将 Parent2.prototype.constructor 改成 Child3
//组合优化2,通过 Object.create() 创建一个中间对象,将两个原型对象区别开来,并且继承父构造函数的原型链
Child3.prototype = Object.create(Parent2.prototype);
Child3.prototype.constructor = Child3;
//即 Child3.prototype.__proto__ === Parent2.prototype 为 true
//如此 Child3.prototype 和 Parent2.prototype 被隔离开,是两个对象,不会相互影响
//这种方式为理想继承方式
相关文章
|
2月前
|
程序员 C语言 C++
【C++语言】继承:类特性的扩展,重要的类复用!
【C++语言】继承:类特性的扩展,重要的类复用!
|
3月前
|
算法 编译器 C语言
【C/C++ 编程题 01】用C++设计一个不能被继承的类
【C/C++ 编程题 01】用C++设计一个不能被继承的类
47 0
|
3月前
|
JavaScript 前端开发
Javacript如何实现继承?
在 JavaScript 中,可以使用原型链和构造函数来实现继承。下面分别介绍两种方式的实现方法
37 0
|
12月前
|
安全 Java 编译器
C++ 面向对象三大特性——继承
面向对象三大特性的,封装,继承,多态,今天我们研究研究C++的继承。
|
存储 编译器 C语言
了解C++类的特性
了解C++类的特性
76 0
|
存储 算法 Java
Java集合重点知识详解——优点以及内部继承关系
Java集合重点知识详解——优点以及内部继承关系
85 0
接口和类有什么异同
接口和类有什么异同
|
C# 索引
C#中接口和类有什么异同
C#中接口和类有什么异同
|
消息中间件 JavaScript 小程序
Java动态代理的两种方式及其优缺点
Java动态代理的两种方式及其优缺点
|
安全 Java 程序员
java面向对象的三大特性之封装和继承(配视频讲解)
🍅程序员小王的博客:程序员小王的博客 🍅程序员小王的资源博客:http://wanghj.online/ 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 如有编辑错误联系作者,如果有比较好的文章欢迎分享给我,我会取其精华去其糟粕 🍅java自学的学习路线:java自学的学习路线 ———————————————— 版权声明:本文为CSDN博主「程序员小王java」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/weixin_44385486/article/details/128171102
147 0
java面向对象的三大特性之封装和继承(配视频讲解)