一、是什么

继承(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();
 
 

JavaScript是怎样实现继承的?的更多相关文章

  1. JavaScript对寄生组合式继承的理解

    有关JavaScript的几种继承方式请移步JavaScript的几种继承方式 原型链的缺陷 SubType.prototype = new SuperType(); 这样做的话,SuperType构 ...

  2. web前端学习(二) javascript对象和原型继承

    目录 1. JavaScrpt对象 2. 原型对象和继承 3. 对象的克隆 (1)javascript对象 在JS中,对象是属性的容器.对于单个对象来说,都由属性名和属性值构成:其中属性名需要是标识符 ...

  3. 【面试必备】javascript的原型和继承

    原型.闭包.作用域等知识可以说是js中面试必考的东西,通过你理解的深度也就能衡量出你基本功是否扎实.今天来复习一下javascript的原型和继承,虽说是老生常谈的话题,但对于这些知识,自己亲手写一遍 ...

  4. Javascript的实例化与继承:请停止使用new关键字

    本文同时也发表在我另一篇独立博客 <Javascript的实例化与继承:请停止使用new关键字>(管理员请注意!这两个都是我自己的原创博客!不要踢出首页!不是转载!已经误会三次了!) 标题 ...

  5. 理解JavaScript中的原型继承(2)

    两年前在我学习JavaScript的时候我就写过两篇关于原型继承的博客: 理解JavaScript中原型继承 JavaScript中的原型继承 这两篇博客讲的都是原型的使用,其中一篇还有我学习时的错误 ...

  6. Javascript之对象的继承

    继承是面向对象语言一个非常重要的部分.许多OOP语言都支持接口继承和实现继承两种方式.接口继承:继承方法签名:实现继承:继承实际的方法.在ECMAScript中函数是没有签名的,所以也就无法实现接口继 ...

  7. javascript中的原型继承

    在Javascript面向对象编程中,原型继承不仅是一个重点也是一个不容易掌握的点.在本文中,我们将对Javascript中的原型继承进行一些探索. 基本形式 我们先来看下面一段代码: <cod ...

  8. JavaScript面向对象中的继承

    1.1继承的基本概念 使用一个子类,继承另一个父类,那么子类可以自动拥有父类中的所有属性和方法,这个过程叫做继承. >>>继承的两方,发生在两个类之间. 实现继承的三种方式: 扩展O ...

  9. Javascript 进阶 面向对象编程 继承的一个样例

    Javascript的难点就是面向对象编程,上一篇介绍了Javascript的两种继承方式:Javascript 进阶 继承.这篇使用一个样例来展示js怎样面向对象编程.以及怎样基于类实现继承. 1. ...

  10. Javascript 进阶 面向对象编程 继承的一个例子

    Javascript的难点就是面向对象编程,上一篇介绍了Javascript的两种继承方式:Javascript 进阶 继承,这篇使用一个例子来展示js如何面向对象编程,以及如何基于类实现继承. 1. ...

随机推荐

  1. lightdm开机无法自启问题

    简述 由于我学习了 systemctl disable 服务 这条命令,然后开始皮,把 lightdm 自启动关了,然后开不开了 解决办法:重置 lightdm 服务配置 sudo dpkg-reco ...

  2. 【每日一题】【迭代器,泛型】2022年1月8日-NC93 设计LRU缓存结构

    描述设计LRU(最近最少使用)缓存结构,该结构在构造时确定大小,假设大小为 k ,并有如下两个功能1. set(key, value):将记录(key, value)插入该结构2. get(key): ...

  3. org.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputException

    1.问题概述 将一个 springboot 项目打成 Jar 包后,在本地使用 java -jar 命令启动服务,服务能启动成功,但是会有如下报错信息. 说明: 配置文件为外置配置文件,与 jar 处 ...

  4. 微软跨平台maui开发chatgpt客户端

    image 什么是maui .NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架,用于使用 C# 和 XAML 创建本机移动(ios,andriod)和桌面(windows,mac)应 ...

  5. django.core.exceptions.ImproperlyConfigured: Field name `tester_id` is not valid for model `WebCase`.

    代码: class WebCase(models.Model): id = models.AutoField(primary_key=True) casename = models.CharField ...

  6. JavaScript:this指针

    this指针,存储的是一个内存地址,如同变量一样,指向一块内存区域: 而这个内存区域,保存的就是一个对象的数据,那么这个对象是什么呢? 通常来说,this指针,主要是用在方法(函数)中,用来指向调用方 ...

  7. Redis 数据结构-简单动态字符串

    Redis 数据结构-简单动态字符串 无边落木萧萧下,不尽长江滚滚来. 1.简介 Redis 之所以快主要得益于它的数据结构.操作内存数据库.单线程和多路 I/O 复用模型,进一步窥探下它常见的五种基 ...

  8. 如何在mac电脑上配置命令行工具

    Hi,欢迎大家在有空的时候做客[江涛学编程],这里是2023年的第7篇原创文章,今天我们来聊一聊如何在mac电脑上配置命令行工具 老规矩,拍拍手,上菜. 同学,打开你的mac电脑,按住键盘上的&quo ...

  9. Asp-Net-Core权限认证

    title: Asp.Net Core权限认证 date: 2022-10-27 16:17:52 tags: - .NET 翻了很多的博客,文档,发现asp.net core自带的权限认证还是比较复 ...

  10. BUG日记之——MP使用EeasyExcel技术,读取Excel并保存到数据库中出错

    com.alibaba.excel.exception.ExcelAnalysisException: nested exception is org.apache.ibatis.reflection ...