JS中的类?class语法糖??? 两分钟秒了
itomcoil 2025-05-26 16:36 10 浏览
前言
JS中有类?我们都知道JavaScript是基于原型的语言,并没有内置的类概念。但从ES6开始,JavaScript引入了class关键字作为语法糖,它提供了一种更简洁、更类似于传统面向对象编程的语法来创建对象。
class关键字在语法上类似于许多其他基于类的语言,如Java或C++,但JavaScript的类仍然是基于原型的。
正文
class语法糖有哪些基本用法?
一,定义类
在JavaScript中,你可以使用class关键字来定义一个类。类是一个抽象的概念,它描述了具有相同属性和方法的对象的集合。在类中一定有一个构造器函数constructor,我们可以在constructor中接收参数,将我们需要的参数都加进去。
class Person {
constructor(name, age) {
this.name = name;
this.age = age
}
sayHello() {
console.log(`Hello, my name is ${this.name} and my age is ${this.age}`);
}
}
在上面的例子中,我们定义了一个名为MyClass的类,它有一个构造函数(constructor)和一个方法(sayHello)。构造函数在创建类的实例时被调用,它接受一个参数name并将其存储在实例上。sayHello方法用于打印一条问候信息。
二, 创建类的实例
创建类的实例就是将类实例化,我们使用new关键字调用类的构造函数来创建一个新的对象,这个对象就是该类的实例。
这个新创建的对象会继承类的所有属性和方法(除非它们是静态的),并且可以有自己的状态(即实例属性和方法)。这里以我自己为例
class Person {
constructor(name, age) {
this.name = name;
this.age = age
}
sayHello() {
console.log(`Hello, my name is ${this.name} and my age is ${this.age}`);
}
}
let p = new Person('绵绵冰', 18);//调用然后传入参数
console.log(p);
p.sayHello();
在上面的例子中,我在class类里面传入了参数,定义了一个sayHello方法;我将这个类实例化为p,这个p可以访问我在类中定义的方法
类的实例对象可以访问类中的方法,就像原型一样
类的原型机制
为什么类能实现这样的功能呢?当然和原型离不开关系,因为我们都知道JS是基于原型的语言。js的类也是基于原型的。
他的运行机制主要有三步:
1.类定义
因为当你定义一个类时,实际上你定义了一个构造函数(通过class关键字),并且在这个构造函数上挂载了一些属性和方法。这些属性和方法实际上是定义在构造函数的prototype对象上的。
2.创建实例
当你使用new关键字创建类的实例时,JavaScript引擎会执行以下步骤:
- 创建一个新的空对象。
- 将这个新对象的__proto__设置为类的prototype对象。
- 执行构造函数,并将this绑定到新创建的对象上。
- 如果构造函数返回了一个对象,那么这个对象将成为new表达式的返回值;否则,返回新创建的对象。
3.访问属性和方法
由于实例的__proto__指向了类的prototype对象,所以当你尝试访问实例上的一个属性或方法时,JavaScript会首先在实例自身上查找。如果找不到,它会继续在实例的原型链上查找,直到找到为止,或者直到原型链的末尾(即Object.prototype)
三,继承类
既然JS中的类也是基于原型的,那么就一定和原型一样有类似的继承方法。
在JS中,我们可以使用extends关键字来让一个类继承另一个类的属性和方法。这允许你创建更复杂的类结构,并实现代码的重用。
class Person {
constructor(name, age) {
this.name = name;
this.age = age
}
sayHello() {
console.log(`Hello, my name is ${this.name} and my age is ${this.age}`);
}
}
class Person2 extends Person {
constructor(name, age) {
super(name); // 调用父类的构造函数
this.age = age;
}
introduce() {
console.log(`Hi, I'm ${this.name} and I'm ${this.age} years old.`);
}
}
const p2 = new Person2('绵绵冰2', 25);
p2.sayHello();
p2.introduce();
在上面的例子中,p2就继承了p的class里面的属性和方法,并且添加了新的方法introduce来介绍自己。
四, 静态方法
在JavaScript中,我们可以使用static关键字来定义静态方法。静态方法是挂载在类上的方法,而不是类的实例上。这意味着我我们可以直接通过类名来调用静态方法,而不需要创建类的实例。
class greet {
static greet() {
console.log('Hello from a static method!');
}
}
greet.greet(); // 输出: Hello from a static method!
在这个例子中,我们定义了一个名为greet的类,并在其上定义了一个静态方法greet。我们直接通过类名调用了这个方法,而无需创建类的实例。
五,类中访问器
这是一种特殊类型的方法,用于读取和写入对象的属性。访问器由getter和setter方法组成。getter方法是一个没有参数的方法,用于返回与对象属性相关联的值。setter方法则接收一个参数(即要写入属性的值),并用于修改与对象属性相关联的值。
class Person {
constructor(name, age) {
this._name = name;
this._age = age;
}
// getter方法,用于读取_name属性
get name() {
return this._name;
}
get age() {
return this._age;
}
// setter方法,用于设置_name属性
set age(newAge) {
this._age = newAge;
}
set name(newName) {
this._name = newName;
}
}
const person = new Person('绵绵冰', 18);
// 使用getter方法读取属性
console.log(person.name);
console.log(person.age);
// 使用setter方法设置属性
person.name = '绵绵冰2号';
person.age = 20;
// 再次使用getter方法读取属性,验证setter方法是否生效
console.log(person.name);
console.log(person.age);
在上面这个简单的例子中,我们通过get方法拿到了name和age并且将他们转化为了私有属性(使用下划线前缀表示私有属性,尽管在JavaScript中并不是真正的私有),再通过set将这些属性设置为新的属性值。但是这个简单的例子存在一些问题,我们需要对传入的参数进行一些判断
- 使用 typeof判断输入参数的类型
- 使用 trim()移除字符串开头和结尾的空白符
- 判断经过trim处理后的字符是不是一个空字符,不是空字符返回true
- 使用 &&将两个判断连接,只有当这两个判断都为true时,整个表达式才会返回true
- 否则console.error
class Person {
constructor(name, age) {
this._name = name;
this._age = age;
}
get name() {
return this._name;
}
get age() {
return this._age;
}
set name(newName) {
// 在这里添加一些验证逻辑
if (typeof newName === 'string' && newName.trim() !== '') {
this._name = newName;
} else {
console.error('无效');
}
}
set age(newAge) {
if (typeof newAge === 'number' && newAge >= 0) {
this._age = newAge;
} else {
console.error('无效');
}
}
}
const person = new Person('绵绵冰', 18);
console.log(person.name);
console.log(person.age);
person.name = '绵绵冰2';
person.age = 20;
console.log(person.name);
console.log(person.age);
// 尝试设置一个无效的值,查看setter方法中的验证逻辑是否生效
person.age = '十八'; // 这将触发setter方法中的console.error
原文转自:
https://juejin.cn/post/7382022102679207955
相关推荐
- 最强聚类模型,层次聚类 !!_层次聚类的优缺点
-
哈喽,我是小白~咱们今天聊聊层次聚类,这种聚类方法在后面的使用,也是非常频繁的~首先,聚类很好理解,聚类(Clustering)就是把一堆“东西”自动分组。这些“东西”可以是人、...
- python决策树用于分类和回归问题实际应用案例
-
决策树(DecisionTrees)通过树状结构进行决策,在每个节点上根据特征进行分支。用于分类和回归问题。实际应用案例:预测一个顾客是否会流失。决策树是一种基于树状结构的机器学习算法,用于解决分类...
- Python教程(四十五):推荐系统-个性化推荐算法
-
今日目标o理解推荐系统的基本概念和类型o掌握协同过滤算法(用户和物品)o学会基于内容的推荐方法o了解矩阵分解和深度学习推荐o掌握推荐系统评估和优化技术推荐系统概述推荐系统是信息过滤系统,用于...
- 简单学Python——NumPy库7——排序和去重
-
NumPy数组排序主要用sort方法,sort方法只能将数值按升充排列(可以用[::-1]的切片方式实现降序排序),并且不改变原数组。例如:importnumpyasnpa=np.array(...
- PyTorch实战:TorchVision目标检测模型微调完
-
PyTorch实战:TorchVision目标检测模型微调完整教程一、什么是微调(Finetuning)?微调(Finetuning)是指在已经预训练好的模型基础上,使用自己的数据对模型进行进一步训练...
- C4.5算法解释_简述c4.5算法的基本思想
-
C4.5算法是ID3算法的改进版,它在特征选择上采用了信息增益比来解决ID3算法对取值较多的特征有偏好的问题。C4.5算法也是一种用于决策树构建的算法,它同样基于信息熵的概念。C4.5算法的步骤如下:...
- Python中的数据聚类及可视化分析实践
-
探索如何通过聚类分析揭露糖尿病预测数据集的特征!我们将运用Python的强力工具,深入挖掘数据,以直观的可视化揭示不同特征间的关系。一同探索聚类分析在糖尿病预测中的实践!所有这些可视化都可以通过数据操...
- 用Python来统计大乐透号码的概率分布
-
用Python来统计大乐透号码的概率分布,可以按照以下步骤进行:导入所需的库:使用Python中的numpy库生成数字序列,使用matplotlib库生成概率分布图。读取大乐透历史数据:从网络上找到大...
- python:支持向量机监督学习算法用于二分类和多分类问题示例
-
监督学习-支持向量机(SVM)支持向量机(SupportVectorMachine,简称SVM)是一种常用的监督学习算法,用于解决分类和回归问题。SVM的目标是找到一个最优的超平面,将不同类别的...
- 25个例子学会Pandas Groupby 操作
-
groupby是Pandas在数据分析中最常用的函数之一。它用于根据给定列中的不同值对数据点(即行)进行分组,分组后的数据可以计算生成组的聚合值。如果我们有一个包含汽车品牌和价格信息的数据集,那么可以...
- 数据挖掘流程_数据挖掘流程主要有哪些步骤
-
数据挖掘流程1.了解需求,确认目标说一下几点思考方法:做什么?目的是什么?目标是什么?为什么要做?有什么价值和意义?如何去做?完整解决方案是什么?2.获取数据pandas读取数据pd.read.c...
- 使用Python寻找图像最常见的颜色_python 以图找图
-
如果我们知道图像或对象最常见的是哪种颜色,那么可以解决图像处理中的几个用例,例如在农业领域,我们可能需要确定水果的成熟度。我们可以简单地检查一下水果的颜色是否在预定的范围内,看看它是成熟的,腐烂的,还...
- 财务预算分析全网最佳实践:从每月分析到每天分析
-
原文链接如下:「链接」掌握本文的方法,你就掌握了企业预算精细化分析的能力,全网首发。数据模拟稍微有点问题,不要在意数据细节,先看下最终效果。在编制财务预算或业务预算的过程中,通常预算的所有数据都是按月...
- 常用数据工具去重方法_数据去重公式
-
在数据处理中,去除重复数据是确保数据质量和分析准确性的关键步骤。特别是在处理多列数据时,保留唯一值组合能够有效清理数据集,避免冗余信息对分析结果的干扰。不同的工具和编程语言提供了多种方法来实现多列去重...
- Python教程(四十):PyTorch深度学习-动态计算图
-
今日目标o理解PyTorch的基本概念和动态计算图o掌握PyTorch张量操作和自动求导o学会构建神经网络模型o了解PyTorch的高级特性o掌握模型训练和部署PyTorch概述PyTorc...
- 一周热门
- 最近发表
- 标签列表
-
- ps图案在哪里 (33)
- super().__init__ (33)
- python 获取日期 (34)
- 0xa (36)
- super().__init__()详解 (33)
- python安装包在哪里找 (33)
- linux查看python版本信息 (35)
- python怎么改成中文 (35)
- php文件怎么在浏览器运行 (33)
- eval在python中的意思 (33)
- python安装opencv库 (35)
- python div (34)
- sticky css (33)
- python中random.randint()函数 (34)
- python去掉字符串中的指定字符 (33)
- python入门经典100题 (34)
- anaconda安装路径 (34)
- yield和return的区别 (33)
- 1到10的阶乘之和是多少 (35)
- python安装sklearn库 (33)
- dom和bom区别 (33)
- js 替换指定位置的字符 (33)
- python判断元素是否存在 (33)
- sorted key (33)
- shutil.copy() (33)