当前位置: 首页 > news >正文

爬虫之矛---JavaScript基石篇3<JavaScript构造函数的内部机制和应用(2)>

前言:

继续上一篇https://blog.csdn.net/m0_56758840/article/details/136592611

正文:

1.ES6中的类和构造函数的对应关系

A. 介绍ES6引入的类的概念和语法糖

类的概念:
  • ES6引入了类(class)的概念,类是一种抽象的数据类型,用于表示具有相同属性和方法的对象集合。类具有封装、继承和多态的特性,它提供了一种面向对象的编程方式。
类的语法糖:
  • 在ES6之前,JavaScript使用构造函数和原型的方式来实现面向对象编程。ES6中的类语法糖简化了构造函数和原型的复杂性,提供了更直观和易于理解的方式来定义和使用类。

B. 比较构造函数与类之间的对应关系和转换关系

对应关系:
  • 类可以看作是构造函数的一种语法糖。在概念上,类和构造函数都表示同一种目标,即对象的模板。类中的属性和方法相当于构造函数中的实例属性和原型方法。
转换关系:
  • 类和构造函数之间可以相互转换。我们可以将构造函数转换为类来利用ES6的语法糖,并且可以将类转换回构造函数来保持与之前代码的兼容性。

C. 通过案例解析类和构造函数的相似性和差异性

构造函数示例:
// 构造函数
function Person(name, age) {this.name = name;this.age = age;
}// 构造函数的原型方法
Person.prototype.greet = function() {console.log(`Hi, my name is ${this.name} and I'm ${this.age} years old.`);
};// 实例化对象
const person = new Person("John", 25);
person.greet(); // Hi, my name is John and I'm 25 years old.
类示例:
// 类
class Person {constructor(name, age) {this.name = name;this.age = age;}// 类的方法greet() {console.log(`Hi, my name is ${this.name} and I'm ${this.age} years old.`);}
}// 实例化对象
const person = new Person("John", 25);
person.greet(); // Hi, my name is John and I'm 25 years old.

我们首先使用构造函数创建了一个Person对象,然后通过在原型上添加greet方法来定义对象的行为。

而在类的示例中,我们使用class关键字定义了一个Person类,并在constructor中初始化实例属性。通过在类内部定义方法,我们可以直接为类添加行为。

从功能上来说,构造函数和类创建的对象是相同的,都具有相同的属性和方法。它们都可以实例化对象,并调用实例上的方法。

然而,使用类的语法糖使代码更加清晰和直观。类的语法糖将构造函数和原型的方式隐藏在背后,使我们能够更专注于对象的定义和逻辑。

此外,类还提供了一些额外的语法糖,比如静态方法和继承等。静态方法是定义在类本身上的方法,可以直接通过类访问。继承则通过extends关键字实现,使得子类可以继承父类的属性和方法。

小总结:

通过上述案例的对比,我们可以看到构造函数和类在功能上是相似的,都可以用来创建对象并定义对象的属性和方法。

然而,类的语法糖使代码更加清晰和易读,同时提供了一些额外的语法特性(如静态方法和继承),以提高开发效率和代码的可维护性。

理解类和构造函数之间的对应关系和转换关系对于掌握ES6中的面向对象编程是非常重要的。它可以帮助我们更好地理解现代JavaScript代码中的类的概念和使用方式,同时也有助于我们处理旧代码库和与其他开发者进行交流。

2. 构造函数的最佳实践和常见问题

A. 提供构造函数的命名和设计原则

        命名:

                构造函数的命名应该明确、具有描述性,能够清晰地表达所创建对象的用途和类型。遵循驼峰命名法,首字母大写,以突出构造函数的特殊性。

        单一责任原则:

                构造函数应该只负责创建对象和初始化数据,不应该承担过多的业务逻辑。分离不同的功能,使用关联的方法来处理复杂的业务逻辑。

        封装与可访问性:

                使用适当的访问修饰符(如私有、受保护和公共)来控制属性和方法的可访问性。将需要被外部访问和修改的属性和方法设置为公共的,将内部使用的属性和方法封装起来,防止意外的修改和访问。

B 案例分析构造函数中的错误处理和异常处理

让我们通过一个简单的案例来了解构造函数中的错误处理和异常处理。

function Person(name, age) {if (typeof name !== 'string' || name.length === 0) {throw new Error('Name is invalid!');}if (typeof age !== 'number' || age <= 0) {throw new Error('Age is invalid!');}this.name = name;this.age = age;
}try {const person = new Person('', -1);
} catch (error) {console.log(error.message);
}

我们创建了一个Person构造函数,通过参数检查来验证传入的name和age的有效性。如果参数无效,我们使用throw关键字抛出一个错误,提供相应的错误信息。

在创建对象时,我们可以使用try/catch语句来捕获构造函数中可能抛出的错误,并对错误进行处理。这有助于及时发现和处理错误,避免潜在的问题。

C. 探讨构造函数的性能优化和代码风格

性能优化:

         构造函数中的逻辑应该尽可能简单和高效。避免在构造函数中执行复杂和耗时的操作,以避免延长对象的创建时间。将复杂的逻辑放在其他方法中,通过需要时在对象上调用。

代码风格:

        编写可读性高的构造函数代码,使用一致的缩进和命名约定。注释和文档应该明确说明构造函数的用途、参数和行为。遵循编码标准和最佳实践,以提高代码的可维护性和可读性。

function Person(name, age) {// 参数校验if (typeof name !== 'string' || name.length === 0) {throw new Error('Name is invalid!');}if (typeof age !== 'number' || age <= 0) {throw new Error('Age is invalid!');}// 属性初始化this.name = name;this.age = age;
}// 方法定义
Person.prototype.greet = function () {console.log(`Hi, my name is ${this.name} and I'm ${this.age} years old.`);
};

我们使用注释和文档说明了构造函数的用途和参数校验规则。我们将属性初始化放在构造函数中,将greet方法定义在原型上,以便多个对象共享。

这种代码风格和结构的一致性有助于其他开发者更好地理解代码,提高协作的效率。

小总结:

        总结起来,提供明确的命名和单一责任原则、正确处理错误和异常、性能优化和良好的代码风格是构造函数设计中的关键要素。遵循这些最佳实践能够帮助我们编写出高质量、可维护的构造函数代码,使我们的程序更加健壮、可扩展和可读。

3.使用构造函数创建实际可应用的对象

        通过构造函数,我们能够创建具有相同属性但属性值不同的多个对象,极大地提高了代码的复用性和可维护性。我们将通过三个具体的案例来详细说明构造函数的实际应用。

案例一:创建一个图书对象并调用其方法

首先,我们定义一个构造函数来创建图书对象。每本图书将拥有标题(title)、作者(author)和年份(year)三个属性,以及一个显示图书信息的方法。

function Book(title, author, year) {this.title = title;this.author = author;this.year = year;this.getInfo = function() {return `${this.title} by ${this.author}, published in ${this.year}`;};
}// 使用构造函数创建一个图书对象
const book1 = new Book('JavaScript: The Good Parts', 'Douglas Crockford', 2008);// 调用该图书对象的getInfo方法
console.log(book1.getInfo());

案例二:使用构造函数模拟购物车功能

接下来,我们来模拟一个简单的购物车功能。构造函数CartItem将用于创建购物车项对象,每个对象包括商品名称(name)、单价(price)和数量(quantity)。

function CartItem(name, price, quantity) {this.name = name;this.price = price;this.quantity = quantity;this.getTotal = function() {return this.price * this.quantity;};
}const cart = [new CartItem('Apple', 0.99, 3),new CartItem('Bread', 1.99, 2),new CartItem('Milk', 2.99, 1)
];const totalCost = cart.reduce((total, item) => total + item.getTotal(), 0);
console.log(`Total Cost: $${totalCost.toFixed(2)}`);

案例三:构造函数实现一个简单的游戏角色

最后,我们利用构造函数创建一个简单的游戏角色。角色将包括名字(name)、生命值(health)和攻击力(attack)。同时,角色将有方法来接受攻击(receiveAttack)。

function GameCharacter(name, health, attack) {this.name = name;this.health = health;this.attack = attack;this.receiveAttack = function(damage) {this.health -= damage;console.log(`${this.name} has ${this.health} health remaining.`);};
}const hero = new GameCharacter('Hero', 100, 15);
const monster = new GameCharacter('Monster', 80, 10);// 模拟英雄攻击怪物
monster.receiveAttack(hero.attack);

小总结

        我们看到了JavaScript构造函数在实际应用中的强大功能。构造函数使我们能够轻松地创建具有相似结构但不同数据的对象,从而使代码更加简洁、模块化,并易于维护。掌握构造函数将使你更有效地利用JavaScript的面向对象编程特性,为你的程序增添强大的功能。

总结这些概念后,值得注意的是,虽然构造函数提供了强大的功能,但随着ES6的推出,class语法提供了构建对象和实现继承的新方式,使得代码更接近传统的面向对象编程语言。然而,理解构造函数的工作原理依然非常重要,因为它帮助你深入理解JavaScript的对象模型及其原型链概念。

相关文章:

爬虫之矛---JavaScript基石篇3<JavaScript构造函数的内部机制和应用(2)>

前言: 继续上一篇https://blog.csdn.net/m0_56758840/article/details/136592611 正文: 1.ES6中的类和构造函数的对应关系 A. 介绍ES6引入的类的概念和语法糖 类的概念&#xff1a; ES6引入了类&#xff08;class&#xff09;的概念&#xff0c;类是一种抽象的数据类型&…...

_note_05

1.说一说什么是函数重载&#xff1f; 函数签名相同除了 形参不同数据类型 函数签名相同除了 形参不同个数 2.void关键字的作用&#xff1f;返回值是void &#xff0c;可以写return 吗&#xff1f; 函数无返回&#xff0c;使用void修饰; 可以只使用return使函数结束; 3.按要…...

将格蠹GDK8的cmake3.10升级为cmake3.15

#升级过程# 1、wget https://cmake.org/files/v3.15/cmake-3.15.0-rc1.tar.gz 2、tar -zxvf cmake-3.15.0-rc1.tar.gz 3 、cd cmake-3.15.0-rc1 4、./configure 5、sudo make install 6、reboot 7、查看cmake版本&#xff1a; geduergdk8:~$ cmake --version cmake ve…...

b树(一篇文章带你 理解 )

目录 一、引言 二、B树的基本定义 三、B树的性质与操作 1 查找操作 2 插入操作 3 删除操作 四、B树的应用场景 1 数据库索引 2 文件系统 3 网络路由表 五、哪些数据库系统不使用B树进行索引 1 列式数据库 2 图形数据库 3 内存数据库 4 NoSQL数据库 5 分布式数据…...

OD_2024_C卷_200分_7、5G网络建设【JAVA】【最小生成树】

package odjava;import java.util.Scanner;public class 七_5G网络建设 {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt(); // 基站数量&#xff08;节点数&#xff09;int m sc.nextInt(); // 基站对数量&#xff08;边数&…...

面试题:分布式锁用了 Redis 的什么数据结构

在使用 Redis 实现分布式锁时&#xff0c;通常使用 Redis 的字符串&#xff08;String&#xff09;。Redis 的字符串是最基本的数据类型&#xff0c;一个键对应一个值&#xff0c;它能够存储任何形式的字符串&#xff0c;包括二进制数据。字符串类型的值最多可以是 512MB。 Re…...

【学习心得】websocket协议简介并与http协议对比

一、轮询和长轮询 在websocket协议出现之前&#xff0c;要想实现服务器和客户端的双向持久通信采取的是Ajax轮询。它的原理是每隔一段时间客户端就给服务器发送请求找服务器要数据。 让我们通过一个生活化的比喻来解释轮询和长轮询假设你正在与一位不怎么主动说话的老大爷&…...

基于Token的身份验证:安全与效率的结合

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…...

Electron程序如何在MacOS下获取相册访问权限

1.通过entitiment.plist&#xff0c;在electron-builder签名打包时&#xff0c;给app包打上签名。最后可以通过codesign命令进行验证。 TestPhotos.plist electron-builder配置文件中加上刚刚的plist文件。 通过codesign命令验证&#xff0c;若出现这个&#xff0c;则说明成…...

uniapp让输入框保持聚焦状态,不会失去焦点

使用场景&#xff1a;当输入框还有发送按钮的时候&#xff0c;点击发送希望软键盘不消失&#xff0c;还可以继续输入&#xff0c;或者避免因输入图片标签造成的屏闪问题 多次尝试后发现一个很实用的方法&#xff0c;适用input输入框和editor输入框 解决办法&#xff1a;把cli…...

面试中如何介绍mysql的B+树

B树是B树的变体&#xff0c;也是一颗多路搜索树。在MySQL中&#xff0c;B树是为磁盘或者其他直接辅助存储设备所设计的一种平衡的查找树结构。其具有以下特点&#xff1a; 每个节点最多有m个子女&#xff0c;m阶的B树深度最多为m。非根节点关键值个数范围是⌈m/2⌉-1<k<m…...

【Linux C | 网络编程】多播的概念、多播地址、UDP实现多播的C语言例子

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…...

AIGC实战——GPT(Generative Pre-trained Transformer)

AIGC实战——GPT 0. 前言1. GPT 简介2. 葡萄酒评论数据集3. 注意力机制3.1 查询、键和值3.2 多头注意力3.3 因果掩码 4. Transformer4.1 Transformer 块4.2 位置编码 5. 训练GPT6. GPT 分析6.1 生成文本6.2 注意力分数 小结系列链接 0. 前言 注意力机制能够用于构建先进的文本…...

微信小程序-入门

一.通过 Npm方式下载构建 1.下载和安装Npm&#xff1a;Npm https://docs.npmjs.com/downloading-and-installing-node-js-and-npm 或者 https://nodejs.org/en/download/ 未安装npm 提示 以下以安装node安装包为例 按任意键继续 安装完成后 2. 下载和安装小程序开…...

0102全排列和对换-行列式-线性代数

把n个不同的数排成一列&#xff0c;叫做这n个数的全排列&#xff08;排列&#xff09;。 一般情况&#xff0c; 1 , 2 , ⋯ , n 1,2,\cdots,n 1,2,⋯,n是n个数排列的标准次序。 当n个数的任一排列中两个数的先后次序与标准次序不同时&#xff0c;有说有一个逆序。 一个排列中所…...

面向对象的编程语言是什么意思?——跟老吕学Python编程

面向对象的编程语言是什么意思&#xff1f;——跟老吕学Python编程 面向对象是什么意思&#xff1f;面向对象的定义面向对象的早期发展面向对象的背景1.审视问题域的视角2.抽象级别3.封装体4.可重用性 面向对象的特征面向对象的开发方法面向对象程序设计基本思想实现 面向对象的…...

Spring Boot整合MyBatis Plus配置多数据源

Spring Boot 专栏&#xff1a;https://blog.csdn.net/dkbnull/category_9278145.html Spring Cloud 专栏&#xff1a;https://blog.csdn.net/dkbnull/category_9287932.html GitHub&#xff1a;https://github.com/dkbnull/SpringBootDemo Gitee&#xff1a;https://gitee.com/…...

Unix Network Programming Episode 88

‘inetd’ Daemon On a typical Unix system, there could be many servers in existence, just waiting for a client request to arrive. Examples are FTP, Telnet, Rlogin, TFTP, and so on. With systems before 4.3BSD, each of these services had a process associate…...

Java面试题之11MySQL

你对MySQL执行计划怎么看 执行计划就是SQL的执行查询的顺序&#xff0c;以及如何使用索引查询&#xff0c;返回的结果集的行数 在MySQL中&#xff0c;我们可以通过explain命令来查看执行计划。其语法如下&#xff1a; EXPLAIN SELECT * FROM table_name WHERE conditions;在…...

R语言:多值提取到点

ArcGIS中有相关工具实现多值提取到点的功能&#xff0c;在这里&#xff0c;我将使用R语言进行操作&#xff1a; library(dplyr) library(readxl) library(sf) library(raster)setwd("D:/Datasets") Bio <- stack(paste0("D:/Datasets/Data/worldclim2_1km/…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...