一、是什么

继承(inheritance)是面向对象软件技术当中的一个概念。

如果一个类别B“继承自”另一个类别A,就把这个B称为“A的子类”,而把A称为“B的父类别”也可以称“A是B的超类”

  • 继承的优点

继承可以使得子类具有父类别的各种属性和方法,而不需要再次编写相同的代码

在子类别继承父类别的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类别的原有属性和方法,使其获得与父类别不同的功能

虽然JavaScript并不是真正的面向对象语言,但它天生的灵活性,使应用场景更加丰富

关于继承,我们举个形象的例子:

定义一个类(Class)叫汽车,汽车的属性包括颜色、轮胎、品牌、速度、排气量等

class Car{
constructor(color,speed){
this.color = color
this.speed = speed
// ...
}
}

由汽车这个类可以派生出“轿车”和“货车”两个类,在汽车的基础属性上,为轿车添加一个后备厢、给货车添加一个大货箱

// 货车
class Truck extends Car{
constructor(color,speed){
super(color,speed)
this.Container = true // 货箱
}
}

这样轿车和货车就是不一样的,但是二者都属于汽车这个类,汽车、轿车继承了汽车的属性,而不需要再次在“轿车”中定义汽车已经有的属性

在“轿车”继承“汽车”的同时,也可以重新定义汽车的某些属性,并重写或覆盖某些属性和方法,使其获得与“汽车”这个父类不同的属性和方法

class Truck extends Car{
constructor(color,speed){
super(color,speed)
this.color = "black" //覆盖
this.Container = true // 货箱
}
}

从这个例子中就能详细说明汽车、轿车以及卡车之间的继承关系

二、实现方式

JavaScript常见的继承方式:

  • 原型链继承

  • 借用继承(call继承,构造继承)
  • 组合继承

  • 类的继承

原型链继承

特点: 子类利用原型来将父类里面的属性和方法继承一份,给子类来进行使用
优点: 可以将父类里面的属性和方法给继承一份下来,提供给子类来进行使用
缺点: 子类没有自己的原型,用的原型父类的原型的
//定义一个动物的构造函数
function Animal(name,age){
//属性
this.name = name;
this.age = age;
}
//方法
Animal.prototype.eat = function(){
console.log(this.name + "吃");
} //创建一个父类
// const a = new Animal("动动",18)
// console.log(a); //定义一个狗的构造函数
function Dog(){}
// 原型继承 将父类里面的复制一份,交给子类的原型里面来进行使用
Dog.prototype = new Animal()
// const d = new Dog("阿黄",3);//自身是没有的
const d = new Dog();//自身是没有的 //属性
d.name = "阿黄";
d.age = 3;
console.log(d);
//调用吃的方法
d.eat();

借用继承(call继承,构造继承)

特点: 将父类的构造函数当做普通函数来进行执行,使用call改变this的指向
优点: 可以将父类里面的属性继承一份,变成自己自己身上的属性
缺点: 不能继承父类里面的方法

案例:

//定义一个动物的构造函数
function Animal(name,age){
//属性
this.name = name;
this.age = age;
}
//方法
Animal.prototype.eat = function(){
console.log(this.name + "吃");
} //将父类的构造函数当中普通函数来进行调用
// Animal("张三",18) //子类
function Dog(...arg){
// 将父类的构造函数当中普通函数来进行调用,使用call改变this的指向
Animal.call(this,...arg)
} const d = new Dog("张三",18)
console.log(d);

组合继承

特点: 组合继承 = 原型继承 + 借用继承(call继承,构造继承)
优点: 可以继承属性,又可以继承方法
缺点: 在原型当中多了一套属性
案例:
//定义一个动物的构造函数
function Animal(name,age){
//属性
this.name = name;
this.age = age;
}
//方法
Animal.prototype.eat = function(){
console.log(this.name + "吃");
} //组合继承
function Dog(...arg){
//借用继承
Animal.call(this,...arg)
}
//原型继承
Dog.prototype = new Animal() const d = new Dog("阿黄",3)
console.log(d);
d.eat();

类的继承

类的继承的关键字 extends
    语法:
        子类 extends 父类
    constructor这个属性是可以不写,如果我们不写,我就默认存在
    super => 超级
    父类也叫超类
class Father{
//属性 => constructor 里面
constructor(name,age){
this.name = name;
this.age = age;
}
//方法
eat(){
console.log(this.name + '吃');
}
} class Son extends Father{
//子类的构造器
//如果我们写了,就会把默认的构造器给覆盖掉了
constructor(...rest){
super(...rest)
}
}
//创建一个儿子的实例对象
const s = new Son("张三",18);
console.log(s);
s.eat();
 
 

最新文章

  1. jenkins和hudson---打酱油的日子
  2. 浅谈UI设计中妙用无穷的深色系背景
  3. RegOpenKeyEx和RegSetValueEx返回ERROR_SUCCESS,但注册表未发生变化。
  4. LabVIEW设计模式系列——事件结构中值改变事件
  5. 一个cocos2d程序的完整人生(从环境到代码全过程)
  6. java中获取系统属性以及环境变量
  7. WPF拖动总结[转载]
  8. JDBC笔记
  9. MFC--自定义消息
  10. 【爆料】-《阿伯丁大学毕业证书》AU一模一样原件
  11. activeMQ (一)
  12. B - Alyona and towers CodeForces - 739C
  13. 浮点型的三个特殊值 Double.NEGATIVE_INFINITY Double.POSITIVE_INFINITY Double.NaN
  14. SpringBoot 异常处理
  15. JavaScript——DOM树的增查改删总结
  16. 解决Web部署 svg/woff/woff2字体 404错误 iis 解决Web部署 svg/woff/woff2字体 404错误
  17. 玩转mongodb(六):索引,速度的引领(普通索引篇)
  18. boost 智能指针intrusive_ptr
  19. 关闭MongoDB
  20. gdb调试行号错位

热门文章

  1. Linux系统安装 tftp服务 NFS服务
  2. 动态规划篇——线性DP
  3. 错误“AxImp.exe”已退出,代码为 -1163019603
  4. 手动安装Mysql数据库,适合重装系统和绿色安装。
  5. 一个有趣的nginx HTTP 400响应问题分析
  6. python3中的常见知识点3------reduce()函数
  7. windows下django项目创建流程
  8. Nmap常用方法
  9. uniapp微信小程序内部跳转其他微信小程序
  10. vue中mixins(混入)的用法