js中的class类

目录

  • class
  • 构造函数
  • 方法
    • 原型方法
    • 访问器方法
    • 静态方法
  • 继承
    • super
  • minxin
  • 关于多态

class

ES6中之前如果我们想实现只能通过原型链和构造函数的形式,不仅难以理解步骤也十分繁琐
ES6中推出了class关键字,它可以在js中定一个类,通过new来实例化这个类的对象
需要注意的是class关键字只是一个语法糖,它的本质还是通过原型链和构造函数来实现的
class中的代码默认都是运行在strict模式下的
以下是一个简单的class关键字用法

class Person {name = "zhangsan";
}
let people = new Person();
let Person2 = class {name = "lisi";
};
let people2 = new Person2();
console.log(people, people2);

结果
可以看到类有两个定义方法,一个是类声明,即class 类名,还有一个是类表达式,类表达式可以命名也可以不命名,即 var/let/const 局部名称 = class [类名] {}
无论是类声明还是类表达式不会提升,想要使用类就必须在类定义的后面
这种定义在class中的属性被称为公有字段,如果在字段前加上#就成了私有字段

构造函数

如果我们希望在构造对象的时候传入一些参数就需要修改这个类的构造函数constructor

class Person {constructor(name, age, address) {this.name = namethis.age = agethis.address = address}
}
let people = new Person("zhangsan", 18, "wuhan")
console.log(people)

结果
构造函数的名称确定为constructor,如果一个中含有多个constructor则会抛出一个错误

方法

原型方法

能被多个实例共享的方法

class Person {constructor(name, age, address) {this.name = namethis.age = agethis.address = address}eating() {console.log(this.name + "eating...")}running() {console.log(this.name + " running...")}
}
let people = new Person("zhangsan", 18, "wuhan")
console.log(people)
people.running()
people.running()

结果

访问器方法

我们可以针对对应的属性设置getset拦截原本的修改和读取操作

class Person {constructor(name, age, address) {this._name = namethis.age = agethis.address = address}get name() {console.log("执行了读取操作")return this._name}set name(newName) {console.log("执行了设置操作")this._name = newName}
}
let people = new Person("zhangsan", 18, "wuhan")
console.log(people.name)
people.name = "lisi"

结果
注意,如果getset与属性名重复的话就会发生死循环

静态方法

静态方法则是指直接由来调用的方法,不需要实例,通过static来定义静态方法

class Person {constructor(name, age, address) {this.name = namethis.age = agethis.address = address}static birth(name, age, address) {return new Person(name, age, address)}
}
let people = Person.birth("wangwu", 0, "wuhan")
console.log(people)

结果

继承

ES6之前我们想要实现继承是十分麻烦且繁琐的,如何在ES6之前实现继承可以看我这篇文章
js原型与原型链
而在ES6中有了新的关键字extends可以更方便的实现继承

class Person {constructor(name, age, address) {this.name = namethis.age = agethis.address = address}
}
class Man extends Person {
}

super

super关键字可以访问父类的方法与属性
需要注意的是在constructor中调用super前不能使用this
为什么在调用super前不能访问this可以看我这篇文章
未动笔,未来可寄
super.prop可以访问父类的静态属性与方法

class Person {constructor(name, age, address) {this.name = namethis.age = agethis.address = address}eating() {console.log(this.name + "eating...")}
}
class Man extends Person {constructor(...args) {super(...args)}eating() {super.eating()}
}
let people = new Man("zhangsan", 18, "wuhan")
console.log(people)
people.eating()

结果

minxin

因为js继承只能继承一个,因为函数显式原型不可能有多个
如果我们想要让子类有尽可能多的复用其他类就可以使用混入
混入的原理十分简单,假如我们有ABC三个类,我们希望C能继承AB两个类,思路就是我们可以先让B继承A,再让C继承B
我们可以将这个过程封装成一个函数extends

class Person {constructor(name, age, address) {this.name = namethis.age = agethis.address = address}eating() {console.log(this.name + "eating...")}
}
function minix(BaseClass) {return class extends BaseClass {sleeping() {console.log(this.name + " sleeping...")}}
}
class Man extends minix(Person) {constructor(...args) {super(...args)}eating() {super.eating()}
}
let people = new Man("zhangsan", 18, "wuhan")
console.log(people)
people.eating()
people.sleeping()

结果

关于多态

我觉得js是有多态,多态的概念很简单:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果
就比如a+b,如果传入的是1和2,返回的自然是3,如果传入的是"1"和"2",返回的就是"12"
这么一看js也确实符合
多态最常用的实现方式就是重载重写
重写原型链上已经实现了不必再说,关键就在于重载重载同名但参数不同的方法,但js中方法本身就可以传任意数量任意类型的参数,我们可以通过if来判断不同类型的参数执行什么操作,但这个算不算重载也很难说
我认为js作为一门弱类型的语言天然就应该是具有多态这个特性的

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

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

相关文章

【极光系列】SpringBoot集成Mybatis

【极光系列】SpringBoot集成Mybatis 一.gitee地址 浅夏的猫 shawsongyue 直接下载可用 https://gitee.com/shawsongyue/aurora.git 二.mysql安装教程 详细参考我的另外一遍博客: https://blog.csdn.net/weixin_40736233/article/details/135582926?spm1001.201…

从物联网到数字孪生:智慧社区的未来之路

一、物联网在智慧社区中的应用与挑战 随着科技的飞速发展,物联网技术已经深入到我们生活的方方面面,尤其在智慧社区的建设中发挥着举足轻重的作用。物联网通过连接各种设备和系统,为社区居民提供了更便捷、高效的生活方式,同时也…

Hologres + Flink 流式湖仓建设

Hologres Flink 流式湖仓建设 1 Flink Hologres2 实时维表 Lookup 1 Flink Hologres holo在实时数仓领域非常受欢迎,一般搭配flinkhologres来做实时数仓,中间分层用holo,上下游一般依赖于holo的binlog来下发数据 2 实时维表 Lookup Holo…

第8章-第2节-Java中IO流的简单介绍

1、什么是流 我们可以先想象水流是怎样的?溪水不断流动,最终融入大海;我们今天的学习IO其实如同水流一样,当我们读取文件信息或者写入信息时,如同水流一样,不断读取或者写入,直到业务流程结束。…

高级分布式系统-第13讲 分布式控制经典理论

模糊控制器 模糊控制是以模糊集理论、模糊语言变量和模糊逻辑推理为基础的一种智能控制方法,它是从行为上模仿人的模糊推理和决策过程的一种智能控制方法。 该方法首先将操作人员或专家经验编成模糊规则,然后将来自传感器的实时信号模糊化,…

CAN工具 - ValueCAN3 - 基础介绍

关注菲益科公众号—>对话窗口发送 “CANoe ”或“INCA”,即可获得canoe入门到精通电子书和INCA软件安装包(不带授权码)下载地址。 CAN/CANFD通讯广泛存在于整个车载网络中,几乎每一块软硬件的开发都需要用到CAN工具&#xff0c…

机器学习 | 多层感知机MLP

机器学习 | 多层感知机MLP 1. 实验目的 自行构造一个多层感知机,完成对某种类型的样本数据的分类(如图像、文本等),也可以对人工自行构造的二维平面超过3类数据点(或者其它标准数据集)进行分类。 2. 实验…

Hadoop 3.2.4 集群搭建详细图文教程

一、集群简介 Hadoop 集群包括两个集群:HDFS 集群、YARN 集群。两个集群逻辑上分离、通常物理上在一起;两个集群都是标准的主从架构集群。逻辑上分离 两个集群互相之间没有依赖、互不影响 物理上在一起 某些角色进程往往部署在同一台物理服务器上 MapR…

Open3D (C++) 计算条件数

目录 一、算法原理1、条件数2、参考文献二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 1、条件数 条件数法是目前应用最为广泛的一种病态诊断方法。条件数的定义为:

基于RNN的模型

文本数据是一种典型的具有序列结构的数据,因为文本通常是由一系列的词语或字符组成的序列。每个词语或字符在文本中都有特定的位置和顺序,这种有序的结构对于理解和处理文本的含义至关重要。因此,多数情况下需要使用时间序列建模来完成相应的…

HX711压力传感器学习一(STM32)

目录 原理图:​ 引脚介绍: HX711介绍工作原理: 程序讲解: 整套工程: 发送的代码工程,与博客的不一致,如果编译有报错请按照报错和博客进行修改 原理图: 引脚介绍: VCC和GND引…

计算机体系结构基础复习

1. 计算机系统可划分为哪几个层次,各层次之间的界面是什么? 你认为这样划分层次的意义何在? 答: 计算机系统可划分为四个层次,分别是:应用程序、 操作系统、 硬件系统、 晶体管四个大的层次。 注意把这四个层次联系起来的三个界面。各层次…

gateway Redisson接口级别限流解决方案

文章目录 前言1. 计数器算法(固定窗口限流器)2. 滑动窗口日志限流器3. 漏桶算法(Leaky Bucket)4. 令牌桶算法(Token Bucket)5. 限流队列应用场景实现工具 一、Redisson简介二、Redisson限流器的原理三、Red…

面向对象三大特征之三:多态--java学习笔记

什么是多态 多态是在继承/实现情况下的一种现象,表现为:对象多态、行为多态 对象多态:举个栗子,比如一个人,他可以是一个老师,也可以是一个歌手,也可以是一个丈夫...... 行为多态:举…

PHP反序列化总结4--原生类总结

原生类的简要介绍以及原生类和反序列化的关系 PHP 原生类指的是 PHP 内置的类,它们可以直接在 PHP 代码中使用且无需安装或导入任何库,相当于代码中的内置方法例如echo ,print等等可以直接调用,但是原生类就是可以就直接php中直接…

jmeter分布式服务搭建

目录 一、环境准备 二、 安装包下载 三 、安装jdk 四 、控制机安装 4.1 解压压缩包 4.2 修改 bin/jmeter.properties 4.3 修改 bin/system.properties 五、执行机安装 5.1 解压安装包 5.2 修改 bin/jmeter.properties 5.3 修改 bin/system.properties 5.4 启动执行机 …

关于如何禁用、暂停或退出OneDrive等操作,看这篇文件就够了

​想知道如何禁用OneDrive?你可以暂停OneDrive的文件同步,退出应用程序,阻止它在启动时打开,或者永远从你的机器上删除该应用程序。我们将向你展示如何在Windows计算机上完成所有这些操作。 如何在Windows上关闭OneDrive 有多种方法可以防止OneDrive在你的电脑上妨碍你。…

堆排序——高效解决TOP-K问题

. 个人主页:晓风飞 专栏:数据结构|Linux|C语言 路漫漫其修远兮,吾将上下而求索 文章目录 引言什么是堆?建堆堆排序:排序的最终结果 堆排序实现函数声明交换函数 Swap下沉调整 DnAdd堆排序函数 HeapSort主函数 文件中找…

SpringBoot+Vue实现对称加密和非对称加密

我们先来了解一下什么是对称加密和非对称加密,以及两者的优缺点 对称加密 使用同一个密钥对消息进行加密解密 优点:加密和解密的速度快,适合于数据量大的加解密 缺点:密钥在网络传输中可能被泄露,因此安全性相对较低…

C++核心编程三:函数提高(持续更新)

🌈个人主页:godspeed_lucip 🔥 系列专栏:C从基础到进阶 🌙C核心编程🌏1 函数提高🎄1.1 函数默认参数🎄1.2 函数占位参数🎄1.3 函数重载🍉1.3.1 函数重载概述&…