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 = 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作为一门弱类型的语言天然就应该是具有多态这个特性的

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Flink异步IO

本文讲解 Flink 用于访问外部数据存储的异步 I/O API。对于不熟悉异步或者事件驱动编程的用户,建议先储备一些关于 Future 和事件驱动编程的知识。 本文代码gitee地址: https://gitee.com/ddxygq/BigDataTechnical/blob/main/Flink/src/main/java/operator/AsyncIODemo.java …

ceph、gluster、longhorn选型对比

Ceph Ceph是一个分布式的存储系统,可以在统一的系统中提供唯一的对象、块和文件存储。 名词解释: RADOS: 由自我修复、自我管理、智能存储节点组成的可靠、自主、分布式对象存储LIBRADOS: 一个允许应用程序直接访问 RADO 的库&…

虚幻UE 材质-进阶边界混合之运行时虚拟纹理

之前在学习空山新雨后时对于边缘虚化过渡处理有很多技术 今天又要介绍一个边缘过渡的方法:运行时虚拟纹理 文章目录 前言一、运行时虚拟纹理二、使用步骤总结 前言 边缘过渡柔和的方式我们之前介绍了很多,但是效果也不是最好的。 像素偏移PDO和我们今天…

查准率与查全率在自然语言处理中的核心概念与联系、核心概念和实践应用,如何使用朴素贝叶斯、SVM 和深度学习实现查准率和查全率的计算?

查准率与查全率在自然语言处理中的核心概念与联系、核心概念和实践应用,如何使用朴素贝叶斯、SVM 和深度学习实现查准率和查全率的计算? 人工智能核心技术有:1. 深度学习;2.计算机视觉;3.自然语言处理;4.数据挖掘。其中,深度学习就是使用算法分析数据,从中学习并自动归…

jsonvue-mobile 联动方式说明。

目录 jsonvue-mobile的联动类型分为两种 一种是命令式的: 另一种是响应式的: 联动场景 场景一:某一个字段的值变化时,同步修改另一个字段的值 命令式: 响应式: 场景一演示效果GIF 场景二&#xff1…

对外贸易数据平台解析_外贸三大支撑力_箱讯科技

添加图片注释,不超过 140 字(可选) 三大支撑力支撑我国外贸持续回暖 海关总署近日发布数据显示,今年前11个月,我国进出口总值37.96万亿元,与去年同期持平。进入四季度,我国外贸发展的积极因素…

k8s--动态pvc和pv

前情回顾 存储卷: emptyDir 容器内部,随着pod销毁,emptyDir也会消失 不能做数据持久化 hostPath:持久化存储数据 可以和节点上目录做挂载。pod被销毁了数据还在 NFS:一台机器,提供pod内容器所有的挂载点…

css设置内嵌样式阴影

.box{box-shadow: inset 0 0 10px #f1e227, inset 0 0 10px #b6b70f, inset 0 0 10px #879017, inset 0 0 10px #485b22, inset 0 0 10px #0a272e;/* 这是一个CSS的box-shadow属性的值,用于创建一个元素的内部阴影效果。具体的意思是在元素的边界内部添加五个不同颜…

Java项目:119SpringBoot废品回收系统

博主主页:Java旅途 简介:分享计算机知识、学习路线、系统源码及教程 文末获取源码 一、项目介绍 废品回收系统是由SpringBootMybatis开发的,分为前台和后台,前台进行下单,后台处理。 后台功能如下: 类型…

源码搭建教学:连锁餐饮APP开发实战

连锁餐饮APP,对于很多从事餐饮行业的人来说不会陌生,同样这个项目本身就有着很高的热度。今天,小编将深入为大家讲述一下此系统的前后端开发、数据库设计、用户界面设计等方面,让您深入了解全栈开发的方方面面。 一、项目准备与规…

1.6计算机网络的性能指标

1.6计算机网络的性能指标 常用的计算机网络的性能指标有7个:速率、带宽、吞吐量、时延、往返时间、利用率、丢包率 1.6.1速率 计算机发送的信号是以二进制数字形式的。一个二进制数字就是一个比特(bit,binary digit)字节:Byte,1Byte8bit(1…

android APP修改为鸿蒙APP

将一个Android应用(Android APP)修改为鸿蒙应用(HarmonyOS APP)需要进行一些适配和重构工作,因为两者的底层架构和开发模型存在一些差异。下面是一些通用的步骤和考虑事项,希望对大家有所帮助。北京木奇移动…

C++进阶(三)多态

📘北尘_:个人主页 🌎个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 文章目录 一、多态的概念1、概念 二、多态的定义及实现1、多态的构成条件2、虚函数3、虚函数的重写4、C…

002 Golang-channel-practice

第二题: 创建一个生产器和接收器,再建立一个无缓冲的channel。生产器负责把数据放进管道里,接收器负责把管道里面的数据打印出来。这里我们开5个协程把数据打印出来。 直接上代码! package mainimport ("fmt" )func …

数谷·企声|贵州空港智能科技:以“智”提“质”,助力贵阳智慧机场建设

当前,我国民航正大力推进“平安、绿色、智慧、人文”的四型机场建设。贵州空港智能科技有限公司(下称“空港智能科技”)作为贵州民航产业集团有限公司(下称“民航产业集团”)信息化建设的排头兵和主力军,近…

java JDBC 连接数据库(增删查改)

必须先插入工具包 代码 public static void main(String[] args) {DataSource ds JdbcHelper.getDs();System.out.println(ds);JdbcTemplate jdbcTemplatenew JdbcTemplate(ds);System.out.println(jdbcTemplate);//新增String sql1"insert into biao values(null,?,?,…

GPT Store开业大吉:一场AI技术与创新的盛宴

就在1.11 日,ChatGPT 正式上线 GPT Store ! OpenAI CEO 山姆奥特曼第一时间确认了这个消息: 自从GPTs的概念提出以来,短短两个月内,全球用户已经创造了超过300万个GPTs。 点击 GPT Store 或者进入ChatGpt页面&am…

ChatGPT4 助力 Python 数据分析与可视化、人工智能建模及论文高效撰写

2022年11月30日,可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT3.5,将人工智能的发展推向了一个新的高度。2023年4月,更强版本的ChatGPT4.0上线,文本、语音、图像等多模态交互方式使其在…

HTML--文本

文本一般存在于 body下 段落标签&#xff1a;<p> </p> 换行标签&#xff1a;<br/> 放在一句话里可以换行 <p>这是一段话<br/>这是另一段话</p>文本标签分以下几种&#xff1a; 粗体标签&#xff1a;strong&#xff0c;b 斜体标签&#xf…

Spring Boot 中批量执行 SQL 脚本的实践

在Spring Boot应用中&#xff0c;有时候我们需要批量执行存储在数据库中的 SQL 脚本。本文将介绍一个实际的案例&#xff0c;演示如何通过 Spring Boot、MyBatis 和数据库来实现这一目标。 0、数据库层 CREATE TABLE batchUpdate (id INT AUTO_INCREMENT PRIMARY KEY,update_…