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

一:前言

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

二:Class介绍

1、基础语法

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

    <script>class person{// 这是两个公有属性nameage = 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}})// 将创建的原型赋给StudentStudent.prototype = prototypeconst s = new Student('王五')console.log(s);</script>

     三:总结

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

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

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

相关文章

前端多媒体处理工具——ffmpeg的使用

写在前面 在前端领域&#xff0c;FFmpeg 是一个非常有用的工具&#xff0c;它提供了多种媒体格式的封装和解封装&#xff0c;包括多种音视频编码、多种协议的流媒体、多种色彩格式转换、多种采样率转换、多种码率切换等。可以在多种操作系统安装使用。 安装 下载FFmpeg 在网…

深入探讨 Golang 中的追加操作

通过实际示例探索 Golang 中的追加操作 简介 在 Golang 编程领域&#xff0c;append 操作是一种多才多艺的工具&#xff0c;使开发人员能够动态扩展切片、数组、文件和字符串。在这篇正式的博客文章中&#xff0c;我们将踏上一段旅程&#xff0c;深入探讨在 Golang 中进行追加…

【VSCode】解决Open in browser无效

问题描述&#xff1a; 在VSCode中无论是点击右键&#xff0c;选择在默认浏览器中打开&#xff0c;还是按快捷键alt b都没有反应。 解决办法&#xff1a; 右击文件 --> 在文件资源管理器中显示 右击文件&#xff0c;选择属性 点击更改 选择用默认浏览器打开 最后 此时…

音乐制作软件 Studio One 6 mac中文版软件特点

Studio One mac是一款专业的音乐制作软件&#xff0c;该软件提供了全面的音频编辑和混音功能&#xff0c;包括录制、编曲、合成、采样等多种工具&#xff0c;可用于制作各种类型的音乐&#xff0c;如流行音乐、电子音乐、摇滚乐等。 Studio One mac软件特点 1. 直观易用的界面&…

Defender Antivirus占用资源怎么禁止

前言 有时Defender Antivirus 突然磁盘IO很高。导致机器卡得很&#xff0c;开发代码很不方便&#xff0c;本文就介绍如何禁用这个服务。 操作 下载Defender Control https://www.sordum.org/9480/defender-control-v2-1/ 这是当前的最新版本。下载不了就用云盘地址 &#x…

Android Studio(2022.3.1)设置阿里云源-新旧版本

新版本 #settings.gradle.ktsmaven { url uri("https://maven.aliyun.com/repository/public/") }maven { url uri("https://maven.aliyun.com/repository/google/") }maven { url uri("https://maven.aliyun.com/repository/jcenter/") }ma…

git commit报错:running pre-commit hook: lint-staged

报错截图&#xff1a; 报错信息&#xff1a; running pre-commit hook: lint-staged 解决方式&#xff1a; 在项目(vue)的package.json文件中&#xff0c;查找 “husky” 部分&#xff0c;并确认其下的 “pre-commit” 钩子是否正确地引用了 lint-staged。 其中配置示例如下&a…

大数据测试用例分析

基于大数据分析&#xff0c;对业务系统产生的日志进行智能分析&#xff0c;能够识别日志中的接口、参数、业务流&#xff0c;并依据分析的结果生成测试用例。 问题与背景 业务复杂 业务系统的复杂性&#xff0c;对测试人员的业务能力提出严格要求&#xff0c;加重测试成本。 …

开源网安受邀参加数字安全高峰论坛,为数字经济发展保驾护航

​10月19日&#xff0c;“提升数字安全技术&#xff0c;护航数字经济发展”高峰论坛在常州创意产业园圆满完成。本次论坛由常州国家高新区管委会、常州市工业和信息化局、常州市大数据管理中心主办&#xff0c;聚焦“数据安全”主题&#xff0c;邀请了超百位专家及企业代表共同…

华为云HECS服务器下docker可视化(portainer)

一、docker安装 华为云HECS安装docker-CSDN博客 二、portainer安装 portainer地址&#xff1a;Portainer: Docker and Kubernetes Management Platform 当前portainer分CE&#xff08;开源版&#xff09; 和 BE&#xff08;商业版&#xff09;&#xff0c;用CE即可 1 创建…

Vue3开始

1. Vue3简介 2020年9月18日&#xff0c;Vue.js发布版3.0版本&#xff0c;代号&#xff1a;One Piece&#xff08;海贼王&#xff09; 经历了&#xff1a;4800次提交、40个RFC、600次PR、300贡献者 官方发版地址&#xff1a;Release v3.0.0 One Piece vuejs/core 截止2023年…

ARM映像文件组成

引言 ARM编译器将各种源文件&#xff08;汇编文件、C语言程序文件、C语言程序文件&#xff09;编译生成ELF格式的目标文件&#xff08;后缀为.o文件&#xff0c;以下将目标文件简称为.o文件&#xff09;&#xff0c;.o文件经过连接器&#xff0c;和C/C运行时库一起编译生成ELF格…

如何解决香港服务器使用的常见问题

​  站长们在选择香港服务器租用时会考虑到它的各种性能以及稳定性&#xff0c;这是必须的。但是使用过程中还有些问题也不容忽视&#xff0c;比如&#xff1a;带宽资源是否短缺&#xff0c;是否存在安全漏洞&#xff0c;连接是否正常等这些问题也要考虑到。 香港服务器使用中…

数据库备份与恢复(实战mysqldump+bin-log)

一、为什么要进行数据库备份&#xff1f; 常见数据库备份的应用场景如下&#xff1a; 数据丢失应用场景&#xff1a; 人为操作失误造成某些数据被误操作 软件 BUG 造成部分数据或全部数据丢失 硬件故障造成数据库部分数据或全部数据丢失 安全漏洞被入侵数据恶意破坏 非数据丢…

Leetcode—2331.计算布尔二叉树的值【简单】

2023每日刷题&#xff08;六&#xff09; Leetcode—2331.计算布尔二叉树的值 递归实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ bool evaluateTree(struct TreeNod…

2.1.C++项目:网络版五子棋对战之前置知识

文章目录 一、Websocketpp&#xff08;一&#xff09;Websocket介绍&#xff08;二&#xff09;报文格式&#xff08;三&#xff09;Websocketpp介绍&#xff08;四&#xff09;Websocketpp使用1.websocketpp常用接口介绍2. http/websocket服务器 &#xff08;五&#xff09;Js…

动画制作软件 Animate 2024 mac中文版介绍说明(an2024) v24.0

Animate 2024 mac是一款动画制作软件&#xff0c;它能帮助用户轻松制作出各种精美的动画作品。 Animate 2024拥有强大而直观的设计工作流程&#xff0c;能够让用户自由地构建动画场景、绘制精美的图形&#xff0c;并轻松添加动态效果。无论是传统手绘风格还是骨骼动画&#xff…

【Lua语法】字符串

Lua语言中的字符串是不可变值。不能像在C语言中那样直接改变某个字符串中的某个字符&#xff0c;但是可以通过创建一个新字符串的方式来达到修改的目的 print(add2(1 , 2 ,15,3))a "no one"b string.gsub(a , "no" , "on1111")print(a) print…

第87步 时间序列建模实战:LSTM回归建模

基于WIN10的64位系统演示 一、写在前面 这一期&#xff0c;我们介绍大名鼎鼎的LSTM回归。 同样&#xff0c;这里使用这个数据&#xff1a; 《PLoS One》2015年一篇题目为《Comparison of Two Hybrid Models for Forecasting the Incidence of Hemorrhagic Fever with Renal…

Compose Desktop 使用中的几个问题(分平台加载资源、编写Gradle 任务下载平台资源、桌面特有组件、鼠标键盘事件)

前言 在我之前的文章 Compose For Desktop 实践&#xff1a;使用 Compose-jb 做一个时间水印助手 中&#xff0c;我们使用 Compose For Desktop 写了一个用于读取照片 EXIF 中的拍摄日期参数并以文字水印的方式添加到照片上的桌面程序。 但是事实上&#xff0c;这个程序的名字…