JS类的继承和实现原理详解

news2024/11/18 23:47:28

一:前言

        各位小伙伴在日常开发中,相信一定遇到过Class这种写法。这代表在JS中创建了一个类,并且可以通过这个类去 new 出一个新的对象。其实在JS中,这个类和java中的类是没有区别的,同样具有属性,方法,构造器等。接下来请跟随我的步伐,一起来看一下其包含的内容吧~

二:Class介绍

1、基础语法

        通过下面的代码,我们可以看到,首先定义了一个person类,其中有两个公有属性,分别是有默认值的age,和没有默认值的name。再往下是一个构造器,这个构造器要求传递一个参数,所以当我们调用这个类去实例化对象的时候,必须传递一个参数,这个参数就是name的值。而后有两个公有方法,分别返回了两个不同的语句。具体运行效果可以参考下方的图。

    <script>
        class person{
            // 这是两个公有属性
            name
            age = 18
            // 这个是构造器,创建对象的时候默认调用这个方法去初始化
            constructor(name){
                this.name = name
            }
            // 两个公有方法
            sayHi(){
                console.log('嗨!你好!');
            }
            sayMyself(){
                console.log('我的名字是:' + this.name + '。我的年龄是:' + this.age);
            }
        }

        const p1 = new person('张三')
        p1.sayHi()
        p1.sayMyself()
    </script>

2、calss的继承

        关键字介绍:

  • extendx:用于类声明或者类表达式中,以创建一个类,该类是另一个类的子类
  • super:关键字用于访问对象字面量或类的原型([[ prototype ]])上的属性,或调用父类的构造函数

        这里我们可以看到,一个Student类继承了person。并且有了自己的age属性以及继承的name属性。在子类的构造器中传入了两个参数,并且调用了父类的构造器,修改了name的值。在子类的构造器中修改了age的值。而后去实例化对象,调用父类的方法,实现数据的输出。

    <script>
        class person{
            // 这是公有属性
            name
            // 这个是构造器,创建对象的时候默认调用这个方法去初始化
            constructor(name){
                this.name = name
            }
            // 两个公有方法
            sayHi(){
                console.log('嗨!你好!');
            }
            sayMyself(){
                console.log('我的名字是:' + this.name + '。我的年龄是:' + this.age);
            }
        }
        // Student子类继承了person父类
        class Student extends person{
            // 子类里的公有属性
            age
            // 子类的构造器
            constructor(name,age){
                // 调用父类的构造函数,必须放在  使用this 以前
                super(name)
                this.age = age
            }
        }

        const p2 = new Student('李四',20)
        p2.sayHi()
        p2.sayMyself()
    </script>

        注意:如果父类有构造器,子类必须调用 super 关键字,而且要在 this 前使用。同时子类和父类的方法如果重名,那么默认子类覆盖父类的重名方法。

3、静态属性和私有属性

        关键字介绍

  • 静态:类(Class)通过static关键字定义静态方法。不能在类的实例上调用静态方法,只能通过类本身调用(className.method())
  • 私有:类属性默认是公有的,可以使用哈希前缀 # 的方法将其定义为私有,声明和访问的时候也需要加上。

        这里我们可以看到,由于 person 中的 age 是静态的,所以我们只能通过其本身来访问。

        而#address是私有的,我们无法访问,因此想要访问只能提供一个 getter 方法,即getAddress()方法来访问。 

    <script>
        class person{
            // 这是公有属性
            name
            // 这是静态属性
            static age = 18
            // 这是私有属性
            #address = '贵阳XXXXXX'
            // 这个是构造器,创建对象的时候默认调用这个方法去初始化
            constructor(name){
                this.name = name
            }
            // 静态方法
            static sayHi(){
                console.log('嗨!你好!');
            }
            //公有方法
            sayMyself(){
                console.log('我的名字是:' + this.name);
            }
            getAddress(){
                console.log(this.#address);
            }
        }

        console.log('静态属性只能通过本身来访问' + person.age);
        person.sayHi()


        const p3 = new person('张三')
        p3.sayMyself()
        // 私有属性需要getter来访问
        p3.getAddress()
    </script>

4、寄生组合式继承(ES5)

        上面的三个都是在ES6中所出现的基于Class实现继承。而在ES5中同样也有实现继承的方法,比如原型链继承,组合继承等六种方式。那么在这里我将不会一一详解,只把我个人感觉使用最多,最重要的寄生组合式继承放在这里简要说明一下。

        注意:在ES6中基于class实现的继承,其原理也是寄生组合式继承。

寄生组合式继承:通过借用构造函数来继承属性,通过原型链的混成形式来继承方法。

        知识点介绍:Objcet.create(源对象,要覆盖的属性/方法):将一个对象作为原型,创建一个新的对象。

        下面这个代码,是 定义了一个 Person 父类,和 Student 子类。在这里,子类通过构造函数继承属性。而方法是使用的 Object.create() 来获取了一个 prototype 并且改变了其构造器的指向,然后赋给了子类。

    <script>
        // 父类
        function Person(name){
            this.name = name
        }
        Person.prototype.sayHi =function () {
            console.log(`你好,我叫:${this.name}`);
        }
        // 通过构造函数继承属性
        function Student(name){
            Person.call(this,name)
        }
        // 通过原型链继承方法,第二个参数是改变构造函数的指向
        const prototype = Object.create(Person.prototype,{
            constructor:{
                value:Student
            }
        })

        // 将创建的原型赋给Student
        Student.prototype = prototype

        const s = new Student('王五')
        console.log(s);
    </script>

     三:总结

        掌握继承的原理和在ES6中的实现,是非常重要的,虽然看似简单,使用起来也简单,但是只有当你真正的明白了代码在内部是如何运转的,才能够在以后面对各种突发情况的时候知道解决的办法。因此让我们一起来学习与使用这些宝贵的知识吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1117293.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1209. 带分数

题目&#xff1a; 1209. 带分数 - AcWing题库 思路&#xff1a; 1.targetab/c&#xff0c;由题意a,b,c会包含1~9 且每个数出现且只能出现一次。我们可以抽象化为9个坑位分成3份分别给a,b,c。 2.先采用递归搜索树写出9个坑位的全排列&#xff0c;再分成3个区&#xff0c;分…

多分享,多输出,才有被看见的可能 (抽奖倒计时2天!文末有福利!)

* 戳上方蓝字“前端队长”关注我&#xff0c;每日更新 大家好啊&#xff0c;我是Daotin。 今天讨论一个话题&#xff0c;为什么要多分享&#xff0c;多输出&#xff1f; 因为&#xff0c;只有输出多了&#xff0c;被别人看到的机会才大。 不要相信什么&#xff0c;酒香不怕巷子…

Camtasia2023免费升级最新版本下载

在这个视频的大舞台上&#xff0c;每一帧都是你炫耀的机会&#xff0c;每一秒都是让观众瞪大眼睛的瞬间。现在&#xff0c;让我们一起飞跃时空&#xff0c;用更少的时间创作更多的惊喜吧&#xff01; 就算你是个小白&#xff0c;毫无经验&#xff0c;别担心&#xff0c;Camtas…

【树莓派触摸屏等学习笔记】

前言 树莓派触摸屏 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、触摸屏硬件驱动 出现黑屏的时候&#xff0c;恢复一下txt config.txt 全屏显示 showFull Exec &#xff1a;自启动 surf 算法 特征点识别 算法的复杂度挺高的 特性树莓派强大…

从Linux的tty_struct指针获取驱动上下文

背景 问题 前段时间开发一个tty驱动&#xff0c;用途是实现仪器对GPIB消息的接收、处理和上报。对于上报场景&#xff0c;下位机应用将上报内容写入一个驱动创建的tty设备&#xff0c;tty子系统将应用的输入转发给tty驱动&#xff0c;tty驱动将其转换成对SPI从设备&#xff0…

操作系统 - 《银行家算法》

&#xff08;一&#xff09;安全序列 你是一位成功的商人&#xff0c;手里掌握着 100 个w的资金 … 有三个企业想找你贷款&#xff0c;分别是 企业 B 、企业 A 、企业 T &#xff0c;为描述方便&#xff0c;简称 BAT 。 B 表示&#xff1a;“咱们的项目很有前景&#xff0c;…

中枢听觉处理障碍的行为干预方法

作者&#xff1a;听觉健康 在数十年前&#xff0c;中枢听觉处理障碍(CAPD)的研究已经引起了多学科的关注。1937年&#xff0c;Samuel Orton提出某些儿童的学习障碍与不能有效利用听觉有关。Myklebust是提出“中枢性听力障碍”引起儿童语言学习障碍的先驱者之一。二十世纪五十年…

【lesson13】进程控制初识

文章目录 进程创建 进程创建 请你描述一下&#xff0c;fork创建子进程操作系统都做了什么&#xff1f; fork创建子进程&#xff0c;系统里多了一个进程&#xff0c;进程 内核数据结构 进程代码数据&#xff0c;内核数据结构由OS维护&#xff0c;进程代码数据一般由磁盘维护。…

C++类和对象(1)

C类和对象&#xff08;1&#xff09; C新关键字及语法引用引用的底层原理引用使用的注意事项 auto范围for C结构体新特性C类的特性C类与结构体区别构造函数定义调用 析构函数调用 C新关键字及语法 引用 引用是C加入的新类型&#xff0c;引用是变量的别名&#xff0c;在整体上…

华为OD机试 - TLV格式 - 逻辑分析(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#…

LeetCode:2316. 统计无向图中无法互相到达点对数(C++)

目录 2316. 统计无向图中无法互相到达点对数 题目描述&#xff1a; 实现代码与解析&#xff1a; 并查集 原理思路&#xff1a; 2316. 统计无向图中无法互相到达点对数 题目描述&#xff1a; 给你一个整数 n &#xff0c;表示一张 无向图 中有 n 个节点&#xff0c;编号为…

stable diffusion如何解决gradio外链无法开启的问题

问题确认 为了确认gradio开启不了是gradio库的问题还是stable diffusion的问题&#xff0c;可以先执行这样一段demo代码 import gradio as grdef greet(name):return "Hello " name "!"demo gr.Interface(fngreet, inputs"text", outputs&q…

Spring Cloud 之 Sentinel简介与GATEWAY整合实现

简介 随着微服务的流行&#xff0c;服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式服务架构的流量控制组件&#xff0c;主要以流量为切入点&#xff0c;从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。 熔断 …

Damask使用指南-Hcp结构(镁(考虑孪晶))孪晶如何加入

1&#xff0c;首先利用geom布种子&#xff0c;种子数为40&#xff0c;模型空间尺寸为64*64*1&#xff08;表示二维平面问题&#xff09;代码&#xff1a; 2&#xff0c;根据布种区域生成voronoi镶嵌的晶体结构 代码&#xff1a; 3 检查结构是否正确生成 4&#xff0c;利用dama…

61 不同路径

不同路径 重点&#xff1a;从左上角移动到右下角&#xff0c;m-1次向右&#xff0c;n-1次向下题解1 DP降维——滚动数组 题解2 求解组合 C m n − 2 m − 1 C^{m-1}_{mn-2} Cmn−2m−1​的值 一个机器人位于一个 m x n 网格的 左上角 &#xff08;起始点在下图中标记为 “St…

自己动手写编译器:c 语言模板中的输入模块设计

使用过“框架”的同学都能感受到“框架”带来的方便。所谓”框架“本质上就是一系列代码安排帮助我们完成脏活累活&#xff0c;或者复杂的工作流程后&#xff0c;把处理结果交给我们提供的代码。本节我们要完成的 c 语言模板也是一个框架&#xff0c;它也需要做一系列脏活累活&…

鲲鹏+麒麟V10 mysql8.0适配

检查是否已安装数据库服务 for i in rpm -qa | grep mysql;do rpm -e --nodeps $i;done yum源地址&#xff1a; http://repo.mysql.com/yum/mysql-8.0-community/el/8/aarch64/ 配置yum源&#xff1a; 将mysql相关的rpm包都下载到指定文件里&#xff0c;留作以后考用 yum reins…

UE4 距离场

在项目设置的渲染模块可打开距离场 把该节点连上&#xff0c;该节点的意思是&#xff0c;距离表面越近&#xff0c;材质显示值为0 不接近表面时&#xff1a; 接近表面时 可勾选该值即可看到距离场具体效果&#xff1a; 未接触表面时&#xff1a; 接触表面时&#xff1a; 产生…

2024年仁爱学院专升本招生专业对应范围专业目录更新的通知

天津仁爱学院2024年高职升本科招生专业对应范围专业目录 为了更好的进行天津仁爱学院专升本工作&#xff0c;动画专业不分文理进行录取。为了进一步提升录取专业的培养需要&#xff0c;请同学们复习专业课时加强专业课学习&#xff0c;请同学们在报考时关注天津仁爱学院招生章…

DLP是如何防止数据泄露的?

根据相关调查数据&#xff0c;未来五年全球企业数据泄露防护&#xff08;DLP&#xff09;市场预计将以21.03%的复合年增长率高速增长&#xff0c;到2026年市场规模将达到62.65亿美元。 PC访问地址&#xff1a;获取详细资料 https://isite.baidu.com/site/wjz012xr/2eae091d-1b…