ES6--class类(详解/看完必会)

news2024/11/29 7:46:08

目录

1、基本概念

2、基本用法

3、class与构造函数的区别

4、constructor的使用

5、自定义方法

6、extends和super

(1)问题一:我们想要在点击按钮二的时候改变字体大小,如何写呢?

(2)问题二:有的人又说,那直接再写一遍好了,把原来父类的construtor方法内容全部照搬过来,只是多了一个fontSize属性而已,请问这样可以吗?

(3)super如何使用呢?

(4)除了属性可以改写,方法也可以改写 

7、static关键字

8、setter和getter方法

(1)setter

 (2)getter

全代码粘贴


让你彻底学会class类~

我们通过一个例子来说明这个class类的原理以及如何使用,,,

我们想要实现的功能就是:根据用户输入的内容点击不同的按钮生成两种不同的语句,并输出显示

 先写一个功能html。然后开启我们的class学习之路

      <input type="text">
      <button class="btn1">自动生成语句一</button>
      <button class="btn2">自动生成语句二</button>
      <p></p>

接着我们先用原生js获取到每个标签

      <script>
            const input = document.querySelector('input'),
                  btn1 = document.querySelector('.btn1'),
                  btn2 = document.querySelector('.btn2'),
                  p = document.querySelector('p')
      </script>

1、基本概念

类可以看做是对象的模板,用一个类可以创建出许多不同的对象

2、基本用法

calss 类名 {} 没有分号,类名首字母大写,内容写在花括号里面。实例化执行构造方法,所以必须有构造方法constructor ,但可以不写出来。在构造方法constructor 中定义属性,在构造方法constructor外面定义方法。

3、class与构造函数的区别

大家一听类名首字母大写?就会想起来构造函数,构造函数也是首字母大写,其他class和构造函数都是自家人,Class在语法上更加贴合面向对象的写法,实现继承更加易读、易理解,更易于写java等后端语言的程序员使用,本质上还是语法糖,使用prototype;用typeof检测都是function类型。  那是不是也可以用new生成实例呢?答:正确

接下来我们来定义一个类,然后再生成一个实例。

 注意:这个实例要写在定义类的后面,因为class是没有什么声明提升这样的功能的。

 我们可以看到上面创建的实例,明显是个空实例,因为构造函数的同门师兄弟class里面没有内容,我们要想把他丰富起来,例如添加属性或者方法,这些属性或方法是每次生成实例都会各自添加的,也就是说我们要让每个实例都有自己特有的属性,但是都享用同一套代码,这么一想,好像挺方便的,如何写呢?

我们这时就要用到constructor了constructor是class里面的一个方法,每次new的时候就会触发这个constructor,我们可以通过constructor定义2个参数 

4、constructor的使用

这里创建实例的时候传入的2个参数,此时this.text就被赋值了‘我输入了’,也就是实例的属性text这时就被赋值了‘我输入了’这个字符串。

定义完了属性,如何定义方法?

5、自定义方法

方法直接写就行,在class里面创建方法也不需要写function关键字,也不需要用this。

 这个方法就代表,当触发该方法的时候,p标签里面的内容就会变成Generatestate实例的text属性+用户输入的内容,p标签的字体颜色就会变成实例的color属性。这两个属性都是根据传入的参数来动态变化的。

此时我们来给按钮添加点击事件,来触发实例里面的showWord函数

 点击按钮一看下效果,可以看到输出正确。

 分析一下这个过程:当我们点击按钮一的时候就会生成一个Generatestate实例,实例紧接着执行自己的showWord方法,去改变字体颜色和内容

按钮一方法写好之后,按钮二我们想实现同样的功能,但并不想复制同一份代码,如何实现呢?

6、extends和super

class里面有个叫extends的关键词可以用于继承

那我们现在就来创建一个按钮二的子类来继承刚刚的Generatestate父类。

注意:我们并不需要在子类里面写任何内容,只需要在父类前面加上extends即可。

并给按钮二添加上点击事件、

此时实现的功能是一样的,点击按钮二输出 ‘你输入了’+‘哈哈哈’

(1)问题一:我们想要在点击按钮二的时候改变字体大小,如何写呢?

有人说了,简单啊,在子类里面的constructor里面定义字体大小属性就好了呀。

答:以上写法完全不可行

虽然我们用extends进行了继承,但并不代表我们不能改变子类,所以其实我们在子类写construtor方法的时候,实际上就是在覆盖原来父类的construtor方法。既然覆盖掉了,那我们在new实例的时候给construtor传入了三个参数,其实覆盖之后我们只有一个参数fontSize,所以此时点击按钮的时候,控制台是会报错的

(2)问题二:有的人又说,那直接再写一遍好了,把原来父类的construtor方法内容全部照搬过来,只是多了一个fontSize属性而已,请问这样可以吗?

答:不可以

原因是:如果在子类中写了construtor就必须要调用super ,主要原因是子类的this出现了问题,子类和父类的this都是指向各自的实例,因此在子类里面的this不会指向父类,此时就需要用super来初始化this,具体原因如下:

ES6在继承中强制要求,必须在子类调用super,因为子类的this是由父类得来的。

  • super即可以做为函数调用,又可以做为对象使用做为函数时,只能在constructor内部调用。做为对象则可以在别的方法内调用。
  • class B extends A {} super如果在静态方法内调用super是父类(A),如果方法里有this,则指向该类(B),如果在原型方法内调用super指向父类的原型(A),如果方法里有this,则指向该实例的原型(B)
  • 给super添加属性或者修改,修改的是子类的属性,因为this是子类

注意:在子类construtor里面写this之前一定要写super。总结:先super,后this

(3)super如何使用呢?

子类不需要重复写父类的代码,直接用super来进行调用,如果属性有几十个时更加体现出了方便。

(4)除了属性可以改写,方法也可以改写 

看下效果:

先点击按钮一,再点击按钮二,看到子类方法的调用完全正确

7、static关键字

类class通过 static 关键字定义静态方法。不能在类的实例上调用静态方法,而应该通过类本身调用。不需要实例化类,即可直接通过该类来调用的方法,即称之为“静态方法”。将类中的方法设为静态方法也很简单,在方法前加上static关键字即可。这样该方法就不会被实例继承

当我们不需要也不想要创建新的实例,就可以用static关键字来创建一个方法

我们先定义一个静态方法,返回一段文字

 

我们想把这个函数里面的内容输出到p标签里面,如何实现呢?

 

这样写是否正确?

这里的this用法是正确的,因为在一个静态方法里面调用另一个静态方法是可以用this的,这里的this并不是绑定实例的,是绑定类本身的,因为静态方法是需要用类调用,而不是用实例去调用。这样疑惑就解开了。

此时我们给p标签添加点击事件,在点击事件里面只用 类去调用静态方法tips_to_p,可前段不要用实例去调用静态方法,不然会报错

        

看下效果,点击p标签,就会出现温馨提示:

8、setter和getter方法

 ES6中,可以通过get方法获取属性值,通过set方法对属性值进行更改值。不自定义时,初始化时会自动调用set方法,读取时调用get方法,get方法只能读。

(1)setter

只看概念可能还是不太理解,我们用例子看一下,首先明确的是set和get针对的目标都是属性。

我们用set定义一个属性。就是在类里面进行编写,set+属性名称

看到提示说一个set属性必须有一个参数。我们加上、

在setter里面我们把参数赋值给实例的value属性,并且把value属性值加在原来的p标签内容里面

然后在按钮一点击事件里面进行属性设置即可。

 注意:我们在调用set属性的时候不能加(),是因为它本身是一个属性不是一个方法,虽然定义的方式像是一个方法。但它是一个特殊的访问器属性

此时我们点击按钮,功能就实现了

 (2)getter

get和set是一对的,,get可以获取值,set可以修改值

可以看到提示,get是没有参数的

 给按钮一进行了get值的打印

看下效果,点击按钮一,set和get的作用均起到了效果

 总结:因此我们可以发现,当一个属性word被定义了set和get之后,同一个名字既可以赋值,也可以输出内容,这就很方便了。 

全代码粘贴

<!DOCTYPE html>
<html lang="en">

<head>
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
</head>

<body>
      <input type="text">
      <button class="btn1">自动生成语句一</button>
      <button class="btn2">自动生成语句二</button>
      <p></p>
      <script>
            const input = document.querySelector('input'),
                  btn1 = document.querySelector('.btn1'),
                  btn2 = document.querySelector('.btn2'),
                  p = document.querySelector('p')
            // 定义一个类
            class Generatestate {
                  // 用static创建一个静态方法
                  static getTips() {
                        return '温馨提示:点击按钮即可生成语句'
                  }
                  static tips_to_p() {
                        p.innerHTML = this.getTips()
                  }

                  // 通过constructor定义属性
                  constructor(text, color) {
                        this.text = text
                        this.color = color
                  }
                  showWord() {
                        p.innerHTML = this.text + input.value
                        p.style.color = this.color
                  }
                  // 用set设置一个属性
                  set word(value){
                        this.value = value
                        p.innerHTML += this.value
                  }
                  get word(){
                        return `我是get获取的值:${this.value}`
                  }
            }
            // 创建子类
            class son_Generatestate extends Generatestate {
                  constructor(text, color, fontSize) {
                        super(text, color)
                        this.fontSize = fontSize
                  }
                  showWord() {
                        p.innerHTML = this.text + p.innerHTML
                        p.style.color = this.color
                        p.style.fontSize = this.fontSize
                  }
            }
            // 创建一个类实例,并传入参数
            btn1.addEventListener('click', () => {
                  const generatestate = new Generatestate('我输入了', '#0f0');
                  generatestate.showWord()
                  generatestate.word = '我是set新加的话'
                  console.log(generatestate.word)
            })
            btn2.addEventListener('click', () => {
                  const son_generatestate = new son_Generatestate('你输入了', '#0f0', '30px');
                  son_generatestate.showWord()
            })
            p.addEventListener('click', () => {
                  Generatestate.tips_to_p()
            })
      </script>
</body>
<style>
      .btn1 {
            background: green;
            color: #fff;
      }

      .btn2 {
            background: #F9BD12;
            color: #fff;
      }

      button {
            border: 1px solid transparent;
            padding: 5px 10px;
            border-radius: 5px;
            cursor: pointer;
      }

      p {
            border: 1px solid green;
            width: 430px;
            height: 200px;
            border-radius: 5px;

      }

      input {
            border: 1.5px solid green;
            padding: 5px 10px;
            border-radius: 5px;
            outline-style: none;
      }
</style>

</html>

  那么class的核心知识点就讲完啦~

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

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

相关文章

【极海APM32替代笔记】低功耗模式配置及配置汇总

【极海APM32替代笔记】低功耗模式配置及配置汇总 文章总结&#xff1a;&#xff08;后续更新以相关文章为准&#xff09; 【STM32笔记】低功耗模式、WFI命令等进入不了休眠的可能原因&#xff08;系统定时器SysTick一直产生中断&#xff09; 【STM32笔记】HAL库低功耗模式配置…

万字长文解析!复现和使用GPT-3/ChatGPT,你所应该知道的

关于作者 英文原版作者&#xff1a;杨靖锋&#xff0c;现任亚马逊科学家&#xff0c;本科毕业于北大&#xff0c;硕士毕业于佐治亚理工学院&#xff0c;师从 Stanford 杨笛一教授。 杨昊桐 译&#xff0c;王骁 修订 感谢靳弘业对第一版稿件的建议&#xff0c;感谢陈三星&am…

timm使用swin-transformer

1.安装 pip install timm2.timm中有多少个预训练模型 #timm中有多少个预训练模型 model_pretrain_list timm.list_models(pretrainedTrue) print(len(model_pretrain_list), model_pretrain_list[:3])3加载swin模型一般准会出错 model_ft timm.create_model(swin_base_pat…

Head First设计模式---4.工厂方法模式

2.1工厂方法模式 亦称&#xff1a; 虚拟构造函数、Virtual Constructor、Factory Method 工厂方法模式是一种创建型设计模式&#xff0c; 其在父类中提供一个创建对象的方法&#xff0c; 允许子类决定实例化对象的类型。 [外链图片转存失败,源站可能有防盗链机制,建议将图片…

Linux 终端复用器Tmux

目录 Tmux讲解 配置tmux 配置tmux会话 配置tmux窗口&#xff08;在会话界面进行配置&#xff09; 配置tmux面板 配置窗口共享同步 Tmux讲解 RHEL5/6/7使用的是screen软件包 RHEL8使用的是tumx软件包&#xff08;功能更强大&#xff0c;更易用&#xff09; tmux的三个基本…

阿里云物联网平台设备模拟器

在使用阿里云物联网平台过程中&#xff0c;如果开始调试没有实际的物理设备&#xff0c;可以考虑在阿里云物联网平台使用官方自带的模拟器进行调试。不过也可以通过叶帆科技开发的阿里云物联网平台设备模拟器AliIoTSimulator进行调试&#xff0c;AliIoTSimulator可以独立运行&a…

第49章 API统一集中管理

1 关于统一集中管理API的一些思考 1、统一集中管理是保证工程性项目得保质、保量、成功实施&#xff0c;并对后期维护提供数据支撑的最有效&#xff0c;最节省资源和时间的技能和做法&#xff0c;软件做为一种特殊的工程性项目&#xff0c;也符合上述特性。 2、由于在前台实现中…

Leetcode6. N字形变换

一、题目描述&#xff1a; 将一个给定字符串 s 根据给定的行数 numRows &#xff0c;以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 “PAYPALISHIRING” 行数为 3 时&#xff0c;排列如下&#xff1a; 之后&#xff0c;你的输出需要从左往右逐行读取&#xff0c;产…

【数据结构与算法】算法的时间复杂度和空间复杂度

文章目录前言1.算法效率1.1.如何衡量一个算法的好坏1.2.算法的复杂度2.时间复杂度2.1.时间复杂度的概念2.2.大O的渐进表示法2.3.常见时间复杂度计算举例2.4.常见时间复杂度3.空间复杂度4.复杂度oj练习Practice.1 消失的数字Practice.2 旋转数组写在最后前言 关于时空复杂度的分…

到底什么样的条件才能被浙大MBA录取?攻略集合

新一年管理类联考已悄然启动&#xff0c;很多考生把目标也都放在了浙江大学MBA项目上&#xff0c;那么浙江大学MBA项目好考吗&#xff1f;报考流程是怎样的&#xff1f;杭州达立易考教育在这里给大家汇总整理了浙大MBA项目相关资讯&#xff0c;分享给想要报考浙大MBA的同学&…

每天一道大厂SQL题【Day12】微众银行真题实战(二)

每天一道大厂SQL题【Day12】微众银行真题实战(二) 大家好&#xff0c;我是Maynor。相信大家和我一样&#xff0c;都有一个大厂梦&#xff0c;作为一名资深大数据选手&#xff0c;深知SQL重要性&#xff0c;接下来我准备用100天时间&#xff0c;基于大数据岗面试中的经典SQL题&…

Wgcloud安装和使用(性能监控)

一、Wgcloud说明 官网&#xff1a;https://www.wgstart.com/ WGCLOUD支持主机各种指标监测&#xff08;cpu使用率&#xff0c;cpu温度&#xff0c;内存使用率&#xff0c;磁盘容量&#xff0c;磁盘IO&#xff0c;硬盘SMART健康状态&#xff0c;系统负载&#xff0c;连接数量&…

结合YOLOv8实现目标追踪

博主使用YOLOv8在自制数据集上取得了不错的效果&#xff0c;考虑到后期的安排&#xff0c;需要在完成目标检测后完成目标追踪功能。因此在本篇博文中主要介绍结合YOLOv8实现目标追踪。 项目源码&#xff1a; https://github.com/mikel-brostrom/yolov8_tracking 接下来便是调试…

CSS变量

前端的开发工作中&#xff0c;CSS 是不可或缺的部分&#xff1b;实际工作中&#xff0c;我们通过JavaScript 来进行数据和交互工作&#xff0c;CSS 为用户呈现可视化的界面。有时&#xff0c;CSS 来进行部分交互效果是不是会比 JavaScript 更高效、更省事呢&#xff1f; 一、变…

python并发编程(并发与并行,同步和异步,阻塞与非阻塞)

最近在学python的网络编程&#xff0c;学了socket通信&#xff0c;并利用socket实现了一个具有用户验证功能&#xff0c;可以上传下载文件、可以实现命令行功能&#xff0c;创建和删除文件夹&#xff0c;可以实现的断点续传等功能的FTP服务器。但在这当中&#xff0c;发现一些概…

《JeecgBoot系列》 如何设计表单实现“下拉组件二级联动“ ? 以省市二级联动为例

《JeecgBoot系列》 如何设计表单实现"下拉组件二级联动" ? 以省市二级联动为例 一、准备字典表 1.1 创建字典表 CREATE TABLE sys_link_table ( id int NULL, pid int NULL, name varchar(64) null );1.2 准备数据 idpidname1全国21浙江省32杭州市42宁波市51江苏…

postgres 源码解析50 LWLock轻量锁--1

简介 postgres LWLock&#xff08;轻量级锁&#xff09;是由SpinLock实现&#xff0c;主要提供对共享存储器的数据结构的互斥访问。LWLock有两种锁模式&#xff0c;一种为排他模式&#xff0c;另一种是共享模式&#xff0c;如果想要读取共享内存中的内容&#xff0c;需要在读取…

kafka如何动态消费新增topic主题

一、背景使用spring-kafka客户端&#xff0c;每次新增topic主题&#xff0c;都需要硬编码客户端并重新发布服务&#xff0c;操作麻烦耗时长&#xff0c;对于业务逻辑相似场景&#xff0c;创建新主题动态监听可以用kafka-batch-starter组件二、核心设计点1、动态接入消息&#x…

Scala模式匹配详解(第八章:基本语法、模式守卫、模式匹配类型)(尚硅谷笔记)

模式匹配第 8 章 模式匹配8.1 基本语法8.2 模式守卫8.3 模式匹配类型8.3.1 匹配常量8.3.2 匹配类型8.3.3 匹配数组8.3.4 匹配列表8.3.5 匹配元组8.3.6 匹配对象及样例类8.4 变量声明中的模式匹配8.5 for 表达式中的模式匹配8.6 偏函数中的模式匹配(了解)第 8 章 模式匹配 Scal…

Redis:缓存穿透、缓存雪崩和缓存击穿(未完待续)

Redis的缓存穿透、缓存雪崩和缓存击穿一. 缓存穿透1.1 概念1.2 造成的问题1.3 解决方案1.4 案例&#xff1a;查询商铺信息&#xff08;缓存穿透的实现&#xff09;二. 缓存雪崩2.1 概念2.2 解决方案三. 缓存击穿&#xff08;热点key&#xff09;3.1 概念3.2 解决方案3.3 案例&a…