js中的class类

news2025/4/13 8:26:17

目录

  • 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 = name
        this.age = age
        this.address = address
    }
}
let people = new Person("zhangsan", 18, "wuhan")
console.log(people)

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

方法

原型方法

能被多个实例共享的方法

class Person {
    constructor(name, age, address) {
        this.name = name
        this.age = age
        this.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 = name
        this.age = age
        this.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 = name
        this.age = age
        this.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 = name
        this.age = age
        this.address = address
    }
}
class Man extends Person {
}

super

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

class Person {
    constructor(name, age, address) {
        this.name = name
        this.age = age
        this.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 = name
        this.age = age
        this.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.coloradmin.cn/o/1374863.html

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

相关文章

力扣日记1.10-【二叉树篇】701. 二叉搜索树中的插入操作

力扣日记:【二叉树篇】701. 二叉搜索树中的插入操作 日期:2024. 参考:代码随想录、力扣 —————————————————————— 天哪,上次打开力扣还是2023,转眼已经2024?! 两个星期过去…

2024.1.11

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);speechnew QTextToSpeech(this);id1startTimer(1000);//设置文本到中间ui->sys_label->setAlignment(Qt:…

国产系统-银河麒麟桌面版V10安装字体-wps安装字体

安装系统:银河麒麟V10 demodemo-pc:~/桌面$ cat /proc/version Linux version 5.10.0-8-generic (builddfa379600e539) (gcc (Ubuntu 9.4.0-1kylin1~20.04.1) 9.4.0, GNU ld (GNU Binutils for Ubuntu) 2.34) #33~v10pro-KYLINOS SMP Wed Mar 22 07:21:49 UTC 20230.系统缺失…

智慧医院之定位导航解决方案

移动端LBS应用 通过绘制院方各楼栋各层平面图,利用无线/蓝牙技术可对终端进行实时定位,方便病人、家属等就医,提高就医体验,减少工作人员工作量,减少医患冲突,打造智慧医院。 移动端的LBS位置应用,可分为医院的室内地图展现、室内地图搜索、室内导航、室内定位、室内位…

TinyLlama-1.1B(小羊驼)模型开源-Github高星项目分享

简介 TinyLlama项目旨在在3万亿tokens上进行预训练,构建一个拥有11亿参数的Llama模型。经过精心优化,我们"仅"需16块A100-40G的GPU,便可在90天内完成这个任务🚀🚀。训练已于2023-09-01开始。项目地址&#…

档案统一管理的优点有哪些?

档案统一管理是一种有效的档案管理方式,能够提高档案资料的管理效率和利用价值,适用于各种组织和机构。 档案统一管理的优点包括: 1. 提高档案的管理效率,减少档案的丢失和遗漏。 2. 提升档案利用价值,方便用户查找和使…

01.11

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget) {ui->setupUi(this);//label1 时间snew QTimer(this);s->start(1000);//两个qt5连接//第一个连接为 timeout信号和timeout函数连接…

Java并发编程——伪共享和缓存行问题

在Java并发编程中,伪共享(False Sharing)和缓存行(Cache Line)是与多线程访问共享数据相关的两个重要概念。 伪共享指的是多个线程同时访问同一个缓存行中的不同变量或数据,其中至少一个线程对其中一个变…

Blazor快速开发框架Known-V2.0.0

Known2.0 Known是基于Blazor的企业级快速开发框架,低代码,跨平台,开箱即用,一处代码,多处运行。 官网:http://known.pumantech.comGitee: https://gitee.com/known/KnownGithub:ht…

docker微服务案例

文章目录 建立简单的springboot项目(boot3)boot2建立通过dockerfile发布微服务部署到docker容器编写Dockerfile打包成镜像运行镜像微服务 建立简单的springboot项目(boot3) 1.建立module 2. 改pom <?xml version"1.0" encoding"UTF-8"?> <…

Java面试之并发篇(二)

1、前言 本篇主要基于Java面试题之并发篇&#xff08;一&#xff09;继续梳理java中关于并发相关的高频面试题。本篇的面试题基于网络整理&#xff0c;和自己编辑。在不断的完善补充哦。 2、synchronized 的原理是什么? synchronized是 Java 内置的关键字&#xff0c;它提供…

【LeetCode:49. 字母异位词分组 | 哈希表】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

k8s--集群调度(kube-scheduler)

了解kube-scheduler 由之前博客可知kube-scheduler是k8s中master的核心组件之一 scheduler&#xff1a;负责调度资源。把pod调度到node节点。他有两种策略&#xff1a; 预算策略&#xff1a;人为部署&#xff0c;指定node节点去部署新建的pod 优先策略&#xff1a;通过算法选…

js 数据回调 异步 Promise

回调顺序 JavaScript 函数按照它们被调用的顺序执行。而不是以它们被定义的顺序。 js数据顺序问题 <!DOCTYPE html> <html> <body><h2>JavaScript 函数序列</h2><p>JavaScript 函数按照它们被调用的顺序执行。</p><p id"de…

社区团购配送超市与小程序的共赢之路

对于社区服务来说&#xff0c;搭建一个小程序可以提供更加便捷、高效的服务&#xff0c;提升用户体验。下面我们将详细介绍如何通过乔拓云第三方平台搭建一个社区团购小程序。 首先&#xff0c;你需要打开乔拓云第三方平台&#xff0c;这是一个专门为小程序开发提供的平台。在浏…

【HarmonyOS4.0】第九篇-ArkUI布局容器组件(一)

容器组件指的是它可以包含一个或多个子组件的组件&#xff0c;除了前边介绍过的公共属性外。 一、线性布局容器&#xff08;Row、Column&#xff09; 线性容器类表示按照水平方向或者竖直方向排列子组件的容器&#xff0c;ArkUI开发框架通过 Row 和 Colum 来实现线性布局。 …

IPv6路由协议---IPv6动态路由(OSPFv3-5)

OSPFv3各链路状态通告类型 4.Inter-Area-Router-LSA区域间路由器(4类LSA) 边界路由器(ABR)产生的第4类LSA,在Area 范围内泛洪,描述了到本AS内其他区域的ASBR路由器信息; 每各Inter-Area-Router-LSA包含一个ASBR路由器信息,LSA中的能力选项(Options)与所描述的ASBR …

软件工程各种图

参考视频&#xff1a; 6 分钟学会 UML 类图_哔哩哔哩_bilibili 5 分钟学会 UML 时序图&#xff08;顺序图、序列图&#xff09;_哔哩哔哩_bilibili 3 分钟学会 UML 活动图_哔哩哔哩_bilibili 6 分钟学会 UML 用例图_哔哩哔哩_bilibili 是真的讲的非常好&#xff01;&#…

力扣hot100 路径总和Ⅲ dfs 前缀和 一题双解 超全注释

Problem: 437. 路径总和 III 思路 树的遍历 DFS 一个朴素的做法是搜索以每个节点为根的&#xff08;往下的&#xff09;所有路径&#xff0c;并对路径总和为 targetSumtargetSumtargetSum 的路径进行累加统计。 使用 dfs1 来搜索所有节点&#xff0c;复杂度为 O(n)O(n)O(n)&am…

android 9 reboot流程

机器出现开机 自动进入fastboot模式。可能是init 那个进程挂了 然后调用了 RebootSystem(ANDROID_RB_RESTART2, “bootloader”); 函数进入重启流程&#xff0c;然后重启后进入fastboot 浅读一下reboot流程和怎么进入的fastboot 比如说是那个进程挂了调用了这个函数&#xff0c…