ES6深潜指南:解锁JavaScript类与继承的高级技巧,让您的代码更加优雅

前言

随着前端技术的迅猛发展,JavaScript已经成为构建现代Web应用不可或缺的编程语言。ES6(ECMAScript
2015)引入了许多期待已久的特性,其中类(Classes)和继承机制的引入,极大地增强了JavaScript的面向对象编程能力。本文将深入探讨JavaScript中类和继承的高级技巧,以及如何在实际开发中应用这些技巧,从而提升代码的可读性和可维护性。

在这里插入图片描述

一、JavaScript类的引入

在ES6之前,JavaScript没有类的概念,而是通过构造函数和原型链来模拟类和继承。现在,我们可以用更自然的方式定义类了。

class Person {constructor(name) {this.name = name;}sayHello() {return `Hello, my name is ${this.name}`;}
}const person = new Person('Alice');
console.log(person.sayHello()); // 输出: Hello, my name is Alice

二、继承的实现

通过extends关键字,JavaScript正式引入了类的继承机制。子类可以继承父类的属性和方法,也可以对其进行扩展。

class Programmer extends Person {constructor(name, language) {super(name); // 调用父类的constructorthis.language = language;}code() {return `I am coding in ${this.language}`;}
}const programmer = new Programmer('Bob', 'JavaScript');
console.log(programmer.code()); // 输出: I am coding in JavaScript
console.log(programmer.sayHello()); // 输出: Hello, my name is Bob

三、使用static关键字定义静态方法

要在类中定义静态(类)方法,我们可以使用static关键字。这些方法直接属于类本身,而不是类的实例。

class Utility {static sayHi() {return 'Hi there!';}
}console.log(Utility.sayHi()); // 直接调用类的静态方法

四、使用getset定义属性的访问器

ES6允许我们为类的属性定义getter和setter,这样我们可以控制属性的访问和赋值行为。

class Temperature {constructor(celsius) {this.celsius = celsius;}get fahrenheit() {return this.celsius * 9 / 5 + 32;}set fahrenheit(value) {this.celsius = (value - 32) * 5 / 9;}
}const temp = new Temperature(28);
console.log(temp.fahrenheit); // 输出: 82.4
temp.fahrenheit = 100;
console.log(temp.celsius); // 输出: 37.77777777777778

五、使用Symbol实现私有属性

虽然JavaScript中没有真正的私有属性,通过Symbol我们可以实现类似的功能。

const _privateVar = Symbol('private symbol');class SecretKeeper {constructor() {this[_privateVar] = 'I am only known by me';}getSecret() {return this[_privateVar];}
}const secrets = new SecretKeeper();
console.log(secrets.getSecret()); // 输出: I am only known by me

六、实践案例

案例1:基本继承的实现

在构建电商系统时,商品类(Product)和电子产品类(Electronics)之间的继承关系。

class Product {constructor(name, price) {this.name = name;this.price = price;}
}class Electronics extends Product {constructor(name, price, brand) {super(name, price);this.brand = brand;}showBrand() {return `Brand: ${this.brand}`;}
}const phone = new Electronics('iPhone', 5999, 'Apple');
console.log(phone.showBrand()); // 输出: Brand: Apple

案例2:使用静态方法作为工具函数

在构建数据处理工具时,可以使用静态方法来封装通用功能。

class DataHandler {static uniqueItems(array) {return [...new Set(array)];}
}const items = [1, 2, 2, 3, 4, 4];
console.log(DataHandler.uniqueItems(items)); // 输出: [1, 2, 3, 4]

案例3:使用访问器控制属性

在构建用户模型时,可以使用访问器来隐藏数据的内部表示。

class User {constructor(username) {this.username = username;}get password() {return 'Your password is hidden';}set password(pass) {this._password = pass; // 内部存储密码}
}const user = new User('jsmith');
console.log(user.password); // 输出: Your password is hidden
user.password = 'password123';

案例4:使用Symbol实现类的私有方法

在构建技术栈管理器时,可以使用Symbol来实现类的私有方法。

const _privateMethod = Symbol('private method');class StackManager {constructor() {this.stack = [];this[_privateMethod] = this._log;}push(item) {this.stack.push(item);this[_privateMethod]();}_log() {console.log('Stack updated:', this.stack);}
}const manager = new StackManager();
manager.push('Vue');
// 输出: Stack updated: ['Vue']

七、总结

ES6中类和继承的引入,为JavaScript带来了面向对象编程的强大功能。通过合理利用这些特性,我们能够写出更加优雅和高效的代码。本文通过多个实践案例,演示了类、继承、静态方法、访问器和Symbol的使用方法,希望能够帮助前端开发者更好地掌握这些高级技巧,提升代码质量,优化开发体验。


以上就是对JavaScript类与继承高级技巧的探讨,希望对大家有所启发。在未来的技术迭代中,我们还需要不断学习和实践,将最新技术与实践经验相结合,为Web应用开发贡献更多创新和解决方案。

码克疯v1 | 技术界的疯狂探索者 | 在代码的宇宙中,我是那颗永不满足的探索星。

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

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

相关文章

基于 elementUI / elementUI plus,实现 主要色(主题色)的一件换色(换肤)

一、效果图 二、方法 改变elementUI 的主要色 --el-color-primary 为自己选择的颜色,核心代码如下: // 处理主题样式 export function handleThemeStyle(theme) {document.documentElement.style.setProperty(--el-color-primary, theme) } 三、全部代…

OutOfMemoryError能被catch(Exception)捕获吗?

背景 写了一个 Kafka 消费者程序,Kafka 集群中数据量过大时,消费线程无故退出了,日志打印了心跳 OOM 异常信息: 但是消费线程里面的 run 方法里面明明包含了 catch (Exception e) ,结尾信息没有打印异常,…

2024全网最全面及最新且最为详细的网络安全技巧四 之 sql注入以及mysql绕过技巧 (2)———— 作者:LJS

目录 4.5 DNS记录类型介绍(A记录、MX记录、NS记录等,TXT,CNAME,PTR) 4.5.1 DNS 4.5.2 A记录 4.5.3NS记录 4.5.4 MX记录 4.5.5 CNAME记录 4.5.6 TXT记录 4.5.7 泛域名与泛解析 4.5.8域名绑定 4.5.9 域名转向 4.6 Mysql报错注入之floor报错详解…

【Mac】王国保卫战:起源 for mac(塔防策略游戏)游戏介绍和安装教程

游戏介绍 《王国保卫战:起源》(Kingdom: Origins)是一款策略塔防游戏,其核心玩法融合了塔防、策略管理和资源管理元素。游戏的主要目标是在一个开放的像素化世界中建立和管理自己的王国,并抵御夜晚来袭的怪物入侵。 …

v0.9.6 开源跨平台个人知识管理工具 TidGi-Desktop

在这个信息爆炸的时代,知识管理变得尤为重要。太记(TidGi),一款基于太微(TiddlyWiki)的知识管理桌面应用,正是为了满足人们对信息整理、知识管理和个人隐私保护的需求而设计的。它不仅能够帮助用户高效地管理和整理信息,还能够自动…

go中的方法 func-----数据类型

本文是java学习者学go种产生的容易记混点的笔记,所以有其他编译语言的基础更好 go的方法有点像js 基础 func main() {fmt.Println("Starting")var p *string new(string)*p "hello world"demo : "demo"fmt.Println(*&demo) //这样既然也…

【文献及模型、制图分享】汾河流域新型城镇化与生态韧性耦合协调时空演变及协调影响力研究

公众号新功能 目前公众号新增以下等功能 1、处理GIS出图、Python制图、区位图、土地利用现状图、土地利用动态度和重心迁移图等等 2、核密度分析、网络od分析、地形分析、空间分析等等 3、地理加权回归、地理探测器、生态环境质量指数、地理加权回归模型影响因素分析、计算…

mysql查询2个日期之间的数据,表字段只有年和月,无日期字段查询的解决

1.核心mysql查询 SELECT * FROM 表名 WHERE CONCAT(year, -, LPAD(month, 2, 0)) > 2022-02-08 AND CONCAT(year, -, LPAD(month, 2, 0)) < 2024-06-06;2.表结构 CREATE TABLE ys_datezzq (id int(10) NOT NULL AUTO_INCREMENT,bid int(10) NOT NULL DEFAULT 0 COMMEN…

使用单调队列求滑动窗口最大值

单调队列&#xff1a;队列元素之间的关系具有单调性&#xff08;从队首到队尾单调递增/递减&#xff09;&#xff0c;队首与队尾进行插入与删除操作&#xff0c;使队列保持单调递增/递减&#xff0c;由双端队列deque实现。 通过例题对单调队列进行分析掌握&#xff1a; 使用单…

力扣随机一题 6/26 哈希表 数组 思维

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;IT竞赛 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 题目一&#xff1a; 2869.收集元素的最少操作次数【简单】 题目&#xff…

深度学习31-33

1.负采样方案 &#xff08;1&#xff09;为0是负样本&#xff0c;负样本是认为构造出来的。正样本是有上下文关系 负采样的target是1&#xff0c;说明output word 在input word之后。 2.简介与安装 &#xff08;1&#xff09;caffe:比较经常用于图像识别&#xff0c;有卷积网…

Yolo v5实现细节(2)

Yolo v5代码实现细节 IOU系列损失 在之前的yolo v3中我们使用的定位损失主要使用的是差值平方的形式&#xff0c;通过预测边界框的参数和真实边界框的参数来进行计算求解的。 定位损失 L loc ( t , g ) ∑ i ∈ pos ( σ ( t x i ) − g ^ x i ) 2 ( σ ( t y i ) − g ^ …

云服务器部署LNMP Web环境教程合集(多版linux系统安装方法)

LNMP环境包括Linux、Nginx、MySQL和PHP&#xff0c;Nginx是一款小巧而高效的Web服务器软件&#xff0c;使用阿里云服务器搭建LNMP Web网站环境很简单&#xff0c;支持多种LNMP环境部署教程&#xff0c;可使用ROS模板部署、LNMP镜像以及基于不同Linux操作系统手动部署LNMP全流程…

MySQL进阶——触发器

目录 1介绍 2语法 3案例 3.1 insert插入数据类型 3.2 update修改数据类型 3.3 delete删除数据类型 4视图/存储过程/触发器—小结 1介绍 触发器是与表有关的数据库对象&#xff0c;指在insert/update/delete之前(BEFORE)或之后(AFTER)&#xff0c;触发并执行触发器中定义…

字节发布Depth Anything V2深度模型,比 Depth Anything V1 更精细的细节。

欢迎点击关注下方公众号并加入官方读者交流群&#xff0c;一个有趣有AI的AIGC公众号:关注AI、深度学习、计算机视觉、AIGC、Stable Diffusion、Sora等相关技术&#xff0c;欢迎一起交流学习&#x1f497;&#xff5e; 字节发布Depth Anything V2深度模型。比 Depth Anything V1…

idea使用maven打包报错GBK不可映射字符

方法一&#xff1a;设置环境变量 打开“控制面板” > “系统和安全” > “系统”。点击“高级系统设置”。在“系统属性”窗口中&#xff0c;点击“环境变量”。在“系统变量”部分&#xff0c;点击“新建”&#xff0c;创建一个新的变量&#xff1a; 变量名&#xff1a;…

4.任务调度

1.基本知识 2.任务的状态 FreeRTOS中任务共存在4种状态&#xff1a;Running 运行态 当任务处于实际运行状态称之为运行态&#xff0c;即CPU的使用权被这个任务占用&#xff08;同一时间仅一个任务处于运行态&#xff09;。Ready 就绪态 处于就绪态的任务是指那些能够运行&…

单片机学习记录

一&#xff0c;单片机及开发板介绍 1&#xff0c;基本介绍 单片机&#xff0c;英文Micro Controller Unit&#xff0c;简称MCU内部集成了CPU、RAM、ROM、定时器、中断系统、通讯接口等一系列电脑的常用硬件功能单片机的任务是信息采集(依靠传感器)、处理(依靠CPU)和硬件设备(…

1.x86游戏实战-认识CE

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 链接&#xff1a;https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提取码&#xff1a;6tw3 复…

Day5:有效的字母异位词 242 两个数组的交集 349 快乐数 202 两数之和1

题目242. 有效的字母异位词 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:bool isAnagram(string s, string t) {//把数组当成哈希表&#xff0c;用两个数组来存储取模后的字母对应的数量//26个字母&#xff0c; 模25 0~25int arrs[26];int arrt[26];for(…