ES6 类语法:JavaScript 的现代化面向对象编程
Hi,我是布兰妮甜 !ECMAScript 2015,通常被称为 ES6 或 ES2015,是 JavaScript 语言的一次重大更新。它引入了许多新特性,其中最引人注目的就是类(class)语法。尽管 JavaScript 一直以来都支持基于原型的继承,但新的类语法提供了一种更加直观和易于理解的方式来定义对象构造函数以及它们之间的继承关系。本文将深入探讨
ES6 类语法,包括它的基本用法、静态方法、继承机制以及私有属性等高级特性。
文章目录
- 一、基础用法
- 二、静态成员
- 三、继承
- 四、getter 和 setter 方法
- 五、类的其他特性
- 六、结论
一、基础用法
1. 定义一个简单的类
在 ES6 中,class 关键字用于声明一个新的类。每个类都有一个构造函数(constructor),它是实例化时自动调用的方法,用来初始化对象的状态。
// 定义一个名为 Person 的类
class Person {// 构造函数constructor(name, age) {this.name = name;this.age = age;}// 实例方法greet() {console.log(`Hello, my name is ${this.name}`);}
}// 创建一个 Person 类的新实例
const person = new Person('Alice', 30);
person.greet(); // Hello, my name is Alice
2. 类表达式 vs 类声明
除了上面提到的类声明形式外,还可以使用类表达式来定义类,这允许我们将类赋值给变量或作为参数传递给函数。
// 类表达式
const Animal = class {constructor(name) {this.name = name;}speak() {console.log(`${this.name} makes a noise.`);}
};const animal = new Animal('Dog');
animal.speak(); // Dog makes a noise.
二、静态成员
静态成员与类本身关联而不是具体的实例。它们通常用来创建工具函数或工厂方法,可以直接通过类名调用,而不需要先创建实例。
class MathUtil {static add(a, b) {return a + b;}static subtract(a, b) {return a - b;}
}console.log(MathUtil.add(5, 7)); // 12
console.log(MathUtil.subtract(10, 4)); // 6
三、继承
ES6 类支持基于 extends 关键字的单继承模式,子类可以从父类继承属性和方法,并可以重写这些成员以实现多态性。
class Animal {constructor(name) {this.name = name;}speak() {console.log(`${this.name} makes a noise.`);}
}class Dog extends Animal {constructor(name, breed) {super(name); // 调用父类的构造函数this.breed = breed;}speak() {console.log(`${this.name} barks.`);}
}const d = new Dog('Mitzie', 'Poodle');
d.speak(); // Mitzie barks.
3.1 超类访问
在子类中,可以通过 super() 来调用父类的构造函数,或者使用 super 来引用父类的方法或属性。
class Parent {constructor(value) {this.value = value;}method() {console.log(`Parent method called with ${this.value}`);}
}class Child extends Parent {constructor(value) {super(value); // 调用父类构造函数}method() {super.method(); // 调用父类方法console.log(`Child method called`);}
}const child = new Child('test');
child.method();
// 输出:
// Parent method called with test
// Child method called
四、getter 和 setter 方法
ES6 类允许我们定义 getter 和 setter 方法,这有助于封装数据并控制属性的读取和修改方式。
class Book {constructor(title, author) {this._title = title;this._author = author;}get title() {return this._title.toUpperCase();}set title(newTitle) {if (typeof newTitle === 'string') {this._title = newTitle;} else {console.error('Title must be a string.');}}
}const book = new Book('Great Expectations', 'Charles Dickens');
console.log(book.title); // GREAT EXPECTATIONS
book.title = 'Oliver Twist';
console.log(book.title); // OLIVER TWIST
4.1 私有属性
从 ES2020 开始,JavaScript 支持私有字段(private fields),这些字段只能在类内部访问,外部无法直接操作。
class Counter {#value = 0;increment() {this.#value++;console.log(this.#value);}reset() {this.#value = 0;}
}const counter = new Counter();
counter.increment(); // 1
counter.reset();
counter.increment(); // 1
// counter.#value; // SyntaxError: Private field '#value' must be declared in an enclosing class
五、类的其他特性
5.1 类的静态属性
除了静态方法之外,你也可以为类添加静态属性。静态属性同样属于类本身而不是其实例。
class Example {static property = 'static value';static getProperty() {return this.property;}
}console.log(Example.property); // static value
console.log(Example.getProperty()); // static value
5.2 静态初始化块
从 ES2022 开始,可以在类中使用静态初始化块来执行一些初始化逻辑,这些逻辑仅会在类首次被加载时运行一次。
class Database {static #instance;static {console.log('Initializing database...');Database.#instance = new Database();}constructor() {if (Database.#instance) {throw new Error('Use Database.getInstance()');}// 初始化数据库连接等...}static getInstance() {return Database.#instance;}
}// const db1 = new Database(); // Throws error
const db2 = Database.getInstance();
5.3 公共类字段
ES6 还引入了公共类字段的概念,允许我们在类体中直接声明实例属性,而无需在构造函数中手动设置。
class User {name = 'Guest'; // 默认用户名email;constructor(email) {this.email = email;}
}const user = new User('user@example.com');
console.log(user.name); // Guest
console.log(user.email); // user@example.com
六、结论
ES6 类语法极大地简化了 JavaScript 中的面向对象编程,使得代码更加结构化和易于维护。随着标准的发展,越来越多的新特性被加入到类系统中,如私有字段、静态属性和支持模块化的改进等。掌握这些知识对于现代 Web 开发者来说是非常重要的,无论是构建小型库还是大型应用,类语法都提供了强大的工具来帮助组织和管理代码。
以上就是关于 ES6 类语法的详细讲解。希望这篇文章能够帮助你更全面地理解这一关键特性,并将其应用于实际项目开发之中。
相关文章:
ES6 类语法:JavaScript 的现代化面向对象编程
Hi,我是布兰妮甜 !ECMAScript 2015,通常被称为 ES6 或 ES2015,是 JavaScript 语言的一次重大更新。它引入了许多新特性,其中最引人注目的就是类(class)语法。尽管 JavaScript 一直以来都支持基于…...
Sprintboot原理
配置优先级 Springboot中支持的三种配置文件: application.propertiesapplication.ymlapplication.yaml java系统属性:-Dxxxxxx 命令行参数:-xxxxxx 优先级:命令行参数>java系统属性>application.properties>applicat…...
OpenHarmony 5.0.2 Release来了!
版本概述 OpenHarmony 5.0.2 Release版本对标准系统的能力进行持续完善,以快速迭代的方式推出API 14,相比5.0.1 Release版本,重点做出了如下特性新增或增强: 进一步增强ArkUI、图形图像的能力,提供更多组件的高级属性…...
Qt 控件与布局管理
1. Qt 控件的父子继承关系 在 Qt 中,继承自 QWidget 的类,通常会在构造函数中接收一个 parent 参数。 这个参数用于指定当前空间的父控件,从而建立控件间的父子关系。 当一个控件被设置为另一控件的子控件时,它会自动成为该父控…...
使用小尺寸的图像进行逐像素语义分割训练,出现样本不均衡训练效果问题
在使用小尺寸图像进行逐像素语义分割训练时,确实可能出现样本不均衡问题,且这种问题可能比大尺寸图像更显著。 1. 小尺寸图像如何加剧样本不均衡? (1) 局部裁剪导致类别分布偏差 问题:遥感图像中某些类别(如道路、建…...
0.91英寸OLED显示屏一种具有小尺寸、高分辨率、低功耗特性的显示器件
0.91英寸OLED显示屏是一种具有小尺寸、高分辨率、低功耗特性的显示器件。以下是对0.91英寸OLED显示屏的详细介绍: 一、基本参数 尺寸:0.91英寸分辨率:通常为128x32像素,意味着显示屏上有128列和32行的像素点,总共409…...
读书笔记--分布式服务架构对比及优势
本篇是在上一篇的基础上,主要对共享服务平台建设所依赖的分布式服务架构进行学习,主要记录和思考如下,供大家学习参考。随着企业各业务数字化转型工作的推进,之前在传统的单一系统(或单体应用)模式中&#…...
HTML5 新的 Input 类型详解
HTML5 引入了许多新的输入类型,极大地增强了表单的功能和用户体验。这些新的输入类型不仅提供了更好的输入控制,还支持内置的验证功能,减少了开发者手动编写验证逻辑的工作量。本文将全面介绍 HTML5 中新增的输入类型,并结合代码示…...
ESP32-CAM实验集(WebServer)
WebServer 效果图 已连接 web端 platformio.ini ; PlatformIO Project Configuration File ; ; Build options: build flags, source filter ; Upload options: custom upload port, speed and extra flags ; Library options: dependencies, extra library stor…...
Case逢无意难休——深度解析JAVA中case穿透问题
Case逢无意难休——深度解析JAVA中case穿透问题~ 不作溢美之词,不作浮夸文章,此文与功名进取毫不相关也!与大家共勉!! 更多文章:个人主页 系列文章:JAVA专栏 欢迎各位大佬来访哦~互三必回&#…...
Golang笔记——常用库context和runtime
大家好,这里是Good Note,关注 公主号:Goodnote,专栏文章私信限时Free。本文详细介绍Golang的常用库context和runtime,包括库的基本概念和基本函数的使用等。 文章目录 contextcontext 包的基本概念主要类型和函数1. **…...
2000-2020年各省第二产业增加值占GDP比重数据
2000-2020年各省第二产业增加值占GDP比重数据 1、时间:2000-2020年 2、来源:国家统计局、统计年鉴 3、指标:行政区划代码、地区名称、年份、第二产业增加值占GDP比重 4、范围:31省 5、指标解释:第二产业增加值占GDP比重…...
unity商店插件A* Pathfinding Project如何判断一个点是否在导航网格上?
需要使用NavGraph.IsPointOnNavmesh(Vector3 point) 如果点位于导航网的可步行部分,则为真。 如果一个点在可步行导航网表面之上或之下,在任何距离,如果它不在更近的不可步行节点之上 / 之下,则认为它在导航网上。 使用方法 Ast…...
Day24-【13003】短文,数据结构与算法开篇,什么是数据元素?数据结构有哪些类型?什么是抽象类型?
文章目录 13003数据结构与算法全书框架考试题型的分值分布如何? 本次内容概述绪论第一节概览什么是数据、数据元素,数据项,数据项的值?什么是数据结构?分哪两种集合形式(逻辑和存储)?…...
富文本 tinyMCE Vue2 组件使用简易教程
参考官方教程 TinyMCE Vue.js integration technical reference Vue2 项目需要使用 tinyMCE Vue2 组件(tinymce/tinymce-vue)的第 3 版 安装组件 npm install --save "tinymce/tinymce-vue^3" 编写组件调用 <template><Editorref"editor"v-m…...
强化学习在自动驾驶中的实现与挑战
强化学习在自动驾驶中的实现与挑战 自动驾驶技术作为当今人工智能领域的前沿之一,正通过各种方式改变我们的出行方式。而强化学习(Reinforcement Learning, RL),作为机器学习的一大分支,在自动驾驶的实现中扮演了至关重要的角色。它通过模仿人类驾驶员的决策过程,为车辆…...
记录 | MaxKB创建本地AI智能问答系统
目录 前言一、重建MaxKBStep1 复制路径Step2 删除MaxKBStep3 创建数据存储文件夹Step4 重建 二、创建知识库Step1 新建知识库Step2 下载测试所用的txtStep3 上传本地文档Step4 选择模型补充智谱的API Key如何获取 Step5 查看是否成功 三、创建应用Step1 新建应用Step2 配置AI助…...
特种作业操作之低压电工考试真题
1.下面( )属于顺磁性材料。 A. 铜 B. 水 C. 空气 答案:C 2.事故照明一般采用( )。 A. 日光灯 B. 白炽灯 C. 压汞灯 答案:B 3.人体同时接触带电设备或线路中的两相导体时,电流从一相通过人体流…...
[免费]基于Python的Django博客系统【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的基于Python的Django博客系统,分享下哈。 项目视频演示 【免费】基于Python的Django博客系统 Python毕业设计_哔哩哔哩_bilibili 项目介绍 随着互联网技术的飞速发展,信息的传播与…...
Cannot resolve symbol ‘XXX‘ Maven 依赖问题的解决过程
一、问题描述 在使用 Maven 管理项目依赖时,遇到了一个棘手的问题。具体表现为:在 pom.xml 文件中导入了所需的依赖,并且在 IDE 中导入语句没有显示为红色(表示 IDE 没有提示依赖缺失),但是在实际使用这些依…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
华为OD机试-最短木板长度-二分法(A卷,100分)
此题是一个最大化最小值的典型例题, 因为搜索范围是有界的,上界最大木板长度补充的全部木料长度,下界最小木板长度; 即left0,right10^6; 我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功…...
