JavaScript 中的 Class 类

devtools/2024/9/25 13:53:51/
class="baidu_pl">
class="article_content clearfix">
class="markdown_views prism-atom-one-dark">

在这里插入图片描述

🔥 个人主页:空白诗

在这里插入图片描述

class="toc">

文章目录

    • 🔥 引言
    • 🎯 基础知识
    • 🏗️ 构造函数 (Constructor)
    • 🔐 私有字段 (Private Fields)
    • 🔐 私有方法 (Private Methods)
    • 🧬 继承 (Inheritance)
    • 📦 静态方法与属性 (Static Methods and Properties)
      • 静态方法
      • 静态属性
      • 示例代码
    • 🔄 Getter 和 Setter 解析
      • 基本概念
      • 示例代码分析
      • 重要用途
      • 注意事项
    • 📚 总结
    • 🔐 相关链接

在这里插入图片描述

🔥 引言

在ECMAScript 2015(ES6)中,class 关键字被引入,为JavaScript带来了一种更接近传统面向对象语言的语法糖。类是创建对象的模板,它们封装了数据(属性)和行为(方法),是实现面向对象编程的基础单元。🎈


🎯 基础知识

在JavaScript这门灵活多变的语言中,Class是ES6引入的一个重要特性,它为面向对象编程提供了一种更简洁、更清晰的语法糖。通过Class,我们可以更容易地创建对象和管理继承关系。本文将从基础到进阶,带你深入探索Class的世界,让代码更加优雅且易于理解。👩‍🏫

基本声明

Class关键字用于定义一个类。类是一种蓝图,用于创建具有特定属性和方法的对象。

class="prism language-class="tags" href="/JAVASCRIPT.html" title=javascript>javascript">class="token keyword">class class="token class-name">Person class="token punctuation">{class="token function">constructorclass="token punctuation">(class="token parameter">nameclass="token punctuation">, ageclass="token punctuation">) class="token punctuation">{class="token keyword">thisclass="token punctuation">.name class="token operator">= nameclass="token punctuation">;class="token keyword">thisclass="token punctuation">.age class="token operator">= ageclass="token punctuation">;class="token punctuation">}class="token function">sayHelloclass="token punctuation">(class="token punctuation">) class="token punctuation">{consoleclass="token punctuation">.class="token function">logclass="token punctuation">(class="token template-string">class="token template-punctuation string">`class="token string">Hello, my name is class="token interpolation">class="token interpolation-punctuation punctuation">${class="token keyword">thisclass="token punctuation">.nameclass="token interpolation-punctuation punctuation">}class="token string"> and I am class="token interpolation">class="token interpolation-punctuation punctuation">${class="token keyword">thisclass="token punctuation">.ageclass="token interpolation-punctuation punctuation">}class="token string"> years old.class="token template-punctuation string">`class="token punctuation">)class="token punctuation">;class="token punctuation">}
class="token punctuation">}
  • constructor 是类的构造函数,用于初始化新创建的实例。
  • sayHello 是类的一个方法。

创建实例

创建类的实例就像调用构造函数一样简单:

class="prism language-class="tags" href="/JAVASCRIPT.html" title=javascript>javascript">class="token keyword">const alice class="token operator">= class="token keyword">new class="token class-name">Personclass="token punctuation">(class="token string">'Alice'class="token punctuation">, class="token number">30class="token punctuation">)class="token punctuation">;
aliceclass="token punctuation">.class="token function">sayHelloclass="token punctuation">(class="token punctuation">)class="token punctuation">; class="token comment">// 输出: Hello, my name is Alice and I am 30 years old.

🏗️ 构造函数 (Constructor)

构造函数是一个特殊的方法,用于初始化新创建的对象。每当你使用 new 关键字创建类的实例时,构造函数会被自动调用。

class="prism language-class="tags" href="/JAVASCRIPT.html" title=javascript>javascript">class="token comment">// 定义一个Person类,包含姓名(name)和年龄(age)属性
class="token keyword">class class="token class-name">Person class="token punctuation">{class="token comment">/*** 构造函数* @param {string} name - 人的名字* @param {number} age - 人的年龄*/class="token function">constructorclass="token punctuation">(class="token parameter">nameclass="token punctuation">, ageclass="token punctuation">) class="token punctuation">{class="token comment">// 使用'this'关键字给实例绑定属性class="token comment">// 'this'在此处指的是新创建的Person实例class="token keyword">thisclass="token punctuation">.name class="token operator">= nameclass="token punctuation">; class="token comment">// 绑定name属性class="token keyword">thisclass="token punctuation">.age class="token operator">= ageclass="token punctuation">;   class="token comment">// 绑定age属性class="token punctuation">}
class="token punctuation">}class="token comment">// 使用'new'关键字创建Person类的实例
class="token keyword">const alice class="token operator">= class="token keyword">new class="token class-name">Personclass="token punctuation">(class="token string">'Alice'class="token punctuation">, class="token number">30class="token punctuation">)class="token punctuation">;class="token comment">// 访问alice实例的name属性,输出:Alice
consoleclass="token punctuation">.class="token function">logclass="token punctuation">(aliceclass="token punctuation">.nameclass="token punctuation">)class="token punctuation">; class="token comment">// 输出: Alice
  • 构造函数签名:构造函数的名称必须是constructor,且没有返回值类型声明。
  • 参数:构造函数可以接收任意数量的参数,这些参数用于初始化实例的属性。
  • this的使用:在构造函数内部,this是一个特殊的关键字,它指向新创建的实例对象。
  • 默认值与验证:虽然本例未展示,但在构造函数中可以加入逻辑来为参数设置默认值或进行有效性验证。
  • 自动调用:实例化时,构造函数自动执行,无需手动调用

🔐 私有字段 (Private Fields)

ES2022 引入了私有字段的概念,通过在字段名前加 # 符号来声明,确保了字段的私密性和安全性。

class="prism language-class="tags" href="/JAVASCRIPT.html" title=javascript>javascript">class="token keyword">class class="token class-name">User class="token punctuation">{class="token comment">// 声明一个私有字段 #password#passwordclass="token punctuation">;class="token comment">/*** 构造函数,用于初始化User实例* @param {string} password - 用户的密码*/class="token function">constructorclass="token punctuation">(class="token parameter">passwordclass="token punctuation">) class="token punctuation">{class="token comment">// 使用私有字段 #password 存储密码class="token keyword">thisclass="token punctuation">.#password class="token operator">= passwordclass="token punctuation">;class="token punctuation">}class="token comment">/*** 公共方法,安全地获取密码(实际应用中应谨慎处理密码)* @returns {string} 返回存储的密码*/class="token function">getPasswordclass="token punctuation">(class="token punctuation">) class="token punctuation">{class="token keyword">return class="token keyword">thisclass="token punctuation">.#passwordclass="token punctuation">;class="token punctuation">}
class="token punctuation">}class="token comment">// 创建User类的实例
class="token keyword">const user class="token operator">= class="token keyword">new class="token class-name">Userclass="token punctuation">(class="token string">'mySecret'class="token punctuation">)class="token punctuation">;class="token comment">// 通过公共方法访问私有字段
consoleclass="token punctuation">.class="token function">logclass="token punctuation">(userclass="token punctuation">.class="token function">getPasswordclass="token punctuation">(class="token punctuation">)class="token punctuation">)class="token punctuation">; class="token comment">// 输出: mySecretclass="token comment">// 尝试直接访问私有字段会导致语法错误
class="token comment">// console.log(user.#password); // 这里会引发错误,因为#password是私有的
  • 封装性增强:私有字段有效限制了对类内部状态的直接访问,促进了良好的封装实践。
  • 安全性提升:防止外部代码无意或恶意修改类的内部数据,减少潜在的bug。
  • 设计原则:鼓励使用公共方法(getter/setter)来控制对私有字段的访问,便于未来修改内部实现而不影响外部接口。
  • 语法提示:编辑器和IDE通常会根据井号标记来提示哪些字段是私有的,帮助开发者遵循最佳实践。

虽然私有字段提高了封装性,但在设计API时,应谨慎考虑哪些数据应该设为私有,以平衡封装与灵活性的需求。


🔐 私有方法 (Private Methods)

私有方法是ES2020引入的另一项关键特性,与私有字段类似,它们通过在方法名前添加#符号来定义,以此增强类的封装性并保护类的内部实现细节不被外部访问或篡改。

class="prism language-class="tags" href="/JAVASCRIPT.html" title=javascript>javascript">class="token keyword">class class="token class-name">Calculator class="token punctuation">{class="token comment">// 声明一个私有方法 #multiplyclass="token function">#multiplyclass="token punctuation">(class="token parameter">aclass="token punctuation">, bclass="token punctuation">) class="token punctuation">{class="token comment">// 实现乘法逻辑class="token keyword">return a class="token operator">* bclass="token punctuation">;class="token punctuation">}class="token comment">/*** 公共方法,计算两个数的乘积* @param {number} a - 第一个乘数* @param {number} b - 第二个乘数* @returns {number} 两数的乘积*/class="token function">calculateProductclass="token punctuation">(class="token parameter">aclass="token punctuation">, bclass="token punctuation">) class="token punctuation">{class="token comment">// 内部可以无障碍访问私有方法 #multiplyclass="token keyword">return class="token keyword">thisclass="token punctuation">.class="token function">#multiplyclass="token punctuation">(aclass="token punctuation">, bclass="token punctuation">)class="token punctuation">;class="token punctuation">}
class="token punctuation">}class="token comment">// 创建Calculator类的实例
class="token keyword">const calc class="token operator">= class="token keyword">new class="token class-name">Calculatorclass="token punctuation">(class="token punctuation">)class="token punctuation">;class="token comment">// 通过公共方法间接调用私有方法,得到正确结果
consoleclass="token punctuation">.class="token function">logclass="token punctuation">(calcclass="token punctuation">.class="token function">calculateProductclass="token punctuation">(class="token number">2class="token punctuation">, class="token number">3class="token punctuation">)class="token punctuation">)class="token punctuation">; class="token comment">// 输出: 6class="token comment">// 尝试直接访问或调用私有方法会导致语法错误
class="token comment">// console.log(calc.#multiply(2, 3)); // 这是不允许的,会导致编译或运行时错误
  • 封装性:私有方法隐藏了类的内部计算逻辑,只暴露必要的公共接口,符合面向对象设计的封装原则。
  • 安全性:防止外部代码直接调用或修改私有方法,减少潜在错误和安全风险。
  • 设计模式:鼓励使用面向接口而非实现编程,增强代码的灵活性和可测试性。
  • 代码提示:现代IDE能够识别出私有方法,给予开发者明确的视觉提示,减少误操作。

私有方法是JavaScript类中一种强大的工具,它帮助开发者构建更加健壮、安全和易于维护的代码库。正确使用私有方法,是提升代码质量和团队协作效率的关键之一。


🧬 继承 (Inheritance)

JavaScript中的类支持继承,使用 extends 关键字来实现。子类可以继承父类的属性和方法,并可覆盖或扩展它们。

class="prism language-class="tags" href="/JAVASCRIPT.html" title=javascript>javascript">class="token keyword">class class="token class-name">Animal class="token punctuation">{ class="token comment">// 父类或基类class="token function">constructorclass="token punctuation">(class="token parameter">nameclass="token punctuation">) class="token punctuation">{class="token keyword">thisclass="token punctuation">.name class="token operator">= nameclass="token punctuation">; class="token comment">// 初始化属性class="token punctuation">}class="token comment">// 定义一个方法class="token function">speakclass="token punctuation">(class="token punctuation">) class="token punctuation">{consoleclass="token punctuation">.class="token function">logclass="token punctuation">(class="token template-string">class="token template-punctuation string">`class="token interpolation">class="token interpolation-punctuation punctuation">${class="token keyword">thisclass="token punctuation">.nameclass="token interpolation-punctuation punctuation">}class="token string"> makes a noise.class="token template-punctuation string">`class="token punctuation">)class="token punctuation">;class="token punctuation">}
class="token punctuation">}class="token keyword">class class="token class-name">Dog class="token keyword">extends class="token class-name">Animal class="token punctuation">{ class="token comment">// 子类或派生类,使用extends继承Animalclass="token function">constructorclass="token punctuation">(class="token parameter">nameclass="token punctuation">) class="token punctuation">{class="token keyword">superclass="token punctuation">(nameclass="token punctuation">)class="token punctuation">; class="token comment">// 调用父类构造函数,传递参数class="token punctuation">}class="token comment">// 重写父类的speak方法以适应Dog类的特性class="token function">speakclass="token punctuation">(class="token punctuation">) class="token punctuation">{consoleclass="token punctuation">.class="token function">logclass="token punctuation">(class="token template-string">class="token template-punctuation string">`class="token interpolation">class="token interpolation-punctuation punctuation">${class="token keyword">thisclass="token punctuation">.nameclass="token interpolation-punctuation punctuation">}class="token string"> barks.class="token template-punctuation string">`class="token punctuation">)class="token punctuation">;class="token punctuation">}
class="token punctuation">}class="token keyword">const myDog class="token operator">= class="token keyword">new class="token class-name">Dogclass="token punctuation">(class="token string">'Rex'class="token punctuation">)class="token punctuation">; class="token comment">// 创建Dog类的实例
myDogclass="token punctuation">.class="token function">speakclass="token punctuation">(class="token punctuation">)class="token punctuation">; class="token comment">// 输出: Rex barks.
  • extends关键字:用于创建一个类作为另一个类的子类,继承其所有非私有属性和方法。
  • super关键字:在子类构造函数中调用,用于访问父类的构造函数。这对于正确初始化继承自父类的属性至关重要。
  • 方法重写:子类可以定义与父类同名的方法,从而实现方法的覆盖(重写),根据子类的特点定制功能。
  • 访问控制与继承:父类的公有和受保护成员(没有使用#声明的)可以被子类继承和访问,私有成员则不能直接访问。
  • 多级继承:JavaScript支持多级继承,即一个子类可以再被其他类继承,形成继承链。

高级议题

  • Mixins与多重继承替代方案:由于JavaScript不直接支持多重继承,开发者可以利用组合、 Mixins模式或使用类的静态方法来模拟多重继承的效果。
  • 抽象类与接口概念:虽然JavaScript原生不支持抽象类和接口,但可以通过设计模式和约定来模仿这些概念,指导类的设计与实现。

通过继承机制,JavaScript的类体系能够构建层次清晰、复用性强的代码结构,是面向对象编程中不可或缺的一部分。


📦 静态方法与属性 (Static Methods and Properties)

静态方法和属性是类的一部分,它们不依赖于类的实例,可以直接通过类名访问。这使得静态成员成为执行与类的实例无关操作的理想选择,比如工具函数或常量值。在JavaScript中,使用static关键字来定义静态成员。

静态方法

  • 定义:静态方法是与类关联而非与类的实例关联的方法。它们通常用于执行与类的实例无关的操作,比如实用函数。
  • 访问:通过类名直接调用,无须创建类的实例。
  • 示例:在MathUtil类中,add是一个静态方法,用于执行简单的加法运算,不依赖于任何特定实例的状态。

静态属性

  • 定义:静态属性是类级别的变量,所有类的实例共享同一份数据。它们通常用于存储类的常量值或配置信息。
  • 初始化:静态属性可以在类定义中直接赋值,或者使用类的静态初始化块(ES2022引入)进行更复杂的初始化逻辑。
  • 示例PI是一个静态属性,存储圆周率的近似值,对所有MathUtil的调用者都是一致的。

示例代码

class="prism language-class="tags" href="/JAVASCRIPT.html" title=javascript>javascript">class="token keyword">class class="token class-name">MathUtil class="token punctuation">{class="token comment">// 静态属性定义,存储π的值class="token keyword">static class="token constant">PI class="token operator">= class="token number">3.14159class="token punctuation">;class="token comment">// 静态方法定义,实现两个数的相加class="token keyword">static class="token function">addclass="token punctuation">(class="token parameter">aclass="token punctuation">, bclass="token punctuation">) class="token punctuation">{class="token keyword">return a class="token operator">+ bclass="token punctuation">;class="token punctuation">}
class="token punctuation">}class="token comment">// 直接通过类名调用静态方法和属性
consoleclass="token punctuation">.class="token function">logclass="token punctuation">(MathUtilclass="token punctuation">.class="token function">addclass="token punctuation">(class="token number">2class="token punctuation">, class="token number">3class="token punctuation">)class="token punctuation">)class="token punctuation">; class="token comment">// 输出: 5
consoleclass="token punctuation">.class="token function">logclass="token punctuation">(MathUtilclass="token punctuation">.class="token constant">PIclass="token punctuation">)class="token punctuation">; class="token comment">// 输出: 3.14159class="token comment">// 注意:静态成员不能通过类的实例访问
class="token comment">// const util = new MathUtil();
class="token comment">// util.add(2, 3); // 这是不推荐的,尽管技术上可行,但违反了静态方法的使用原则
  • 共享性:静态方法和属性对于类的所有实例都是共享的,修改它们会影响所有实例。
  • 内存占用:每个静态成员只占用一份内存空间,不同于实例成员每个实例都会有一份。
  • 设计原则:静态成员适合于那些与类的状态无关,仅需通过类本身访问的功能或数据。
  • 访问限制:静态成员不能通过实例访问,这是保持设计清晰和减少误用的一种方式。

综上所述,静态方法和属性为JavaScript类的设计提供了额外的灵活性和功能,特别适用于那些全局工具函数或类级常量的场景。正确使用静态成员,可以使代码更加整洁高效。


🔄 Getter 和 Setter 解析

Getter和Setter是JavaScript类中用于定义访问和修改对象属性的特殊方法,它们为属性访问提供了额外的控制层,允许在获取或设置属性值时执行自定义逻辑,如数据验证、格式化或触发副作用。这种机制被称为“访问器属性”。

基本概念

  • Getter:用于读取属性值。定义时使用get关键字,无参数,返回属性值。
  • Setter:用于设置属性值。定义时使用set关键字,有一个参数(通常是新值),用于更新属性。

示例代码分析

class="prism language-class="tags" href="/JAVASCRIPT.html" title=javascript>javascript">class="token keyword">class class="token class-name">Product class="token punctuation">{class="token function">constructorclass="token punctuation">(class="token parameter">priceclass="token punctuation">) class="token punctuation">{class="token comment">// 使用下划线前缀是一种约定,表示这个属性应该是“受保护”的或内部使用的class="token keyword">thisclass="token punctuation">._price class="token operator">= priceclass="token punctuation">;class="token punctuation">}class="token comment">// Getter方法,获取价格class="token keyword">get class="token function">priceclass="token punctuation">(class="token punctuation">) class="token punctuation">{class="token keyword">return class="token keyword">thisclass="token punctuation">._priceclass="token punctuation">;class="token punctuation">}class="token comment">// Setter方法,设置价格,包含验证逻辑class="token keyword">set class="token function">priceclass="token punctuation">(class="token parameter">newValueclass="token punctuation">) class="token punctuation">{class="token comment">// 验证价格是否为正数class="token keyword">if class="token punctuation">(newValue class="token operator">< class="token number">0class="token punctuation">) class="token punctuation">{class="token keyword">throw class="token keyword">new class="token class-name">Errorclass="token punctuation">(class="token string">'Price cannot be negative'class="token punctuation">)class="token punctuation">;class="token punctuation">}class="token comment">// 通过验证后,更新价格class="token keyword">thisclass="token punctuation">._price class="token operator">= newValueclass="token punctuation">;class="token punctuation">}
class="token punctuation">}class="token comment">// 创建Product实例
class="token keyword">const product class="token operator">= class="token keyword">new class="token class-name">Productclass="token punctuation">(class="token number">10class="token punctuation">)class="token punctuation">;class="token comment">// 使用getter读取价格
consoleclass="token punctuation">.class="token function">logclass="token punctuation">(productclass="token punctuation">.priceclass="token punctuation">)class="token punctuation">; class="token comment">// 输出: 10class="token comment">// 尝试使用setter设置负价格,这将触发错误
class="token keyword">try class="token punctuation">{productclass="token punctuation">.price class="token operator">= class="token operator">-class="token number">5class="token punctuation">;
class="token punctuation">} class="token keyword">catch class="token punctuation">(errorclass="token punctuation">) class="token punctuation">{consoleclass="token punctuation">.class="token function">errorclass="token punctuation">(errorclass="token punctuation">.messageclass="token punctuation">)class="token punctuation">; class="token comment">// 输出: Price cannot be negative
class="token punctuation">}

重要用途

  1. 数据验证:在setter中添加条件检查,确保数据的合法性,如上述示例中确保价格非负。
  2. 属性转换:在getter或setter中转换数据格式,例如,将内部存储的日期转换为字符串输出。
  3. 触发事件:当属性值改变时,可以在setter内部触发自定义事件或执行其他操作。
  4. 封装实现:隐藏属性的实际存储方式或逻辑,提供简洁的公共接口。

注意事项

  • Getter和Setter应成对出现,以便提供一致的访问控制机制。
  • 使用下划线前缀(如_price)是一种常见的做法,用于区分私有或受保护的属性,但JavaScript本身并不强制私有性。
  • 从ES6开始,可以使用私有字段(如#price)来实现更严格的封装,但请注意,私有字段不能直接定义getter和setter。

通过getter和setter,开发者可以灵活地管理对象状态,增强代码的健壮性和可维护性,是实现面向对象设计中封装原则的有效手段。


📚 总结

在JavaScript中,class语法作为一种面向对象编程的结构化方式,为创建可复用、易于维护的代码提供了强大支持。

  1. 构造函数 (Constructor):

    • 负责初始化新创建的类实例,自动在使用new关键字实例化时调用。
    • 可以接收参数并使用this关键字为实例分配属性。
    • 是类定义中的核心入口点,奠定了实例的基础状态。
  2. 私有字段与方法 (Private Fields & Methods):

    • ES2022 引入了私有字段与方法,通过在名称前加#来声明,增强了类的封装性。
    • 私有字段和方法仅能在类内部访问,外部代码无法直接触及,确保了数据安全和实现细节的隐藏。
    • 促进良好的封装实践,限制了对内部状态的不当修改。
  3. 继承 (Inheritance):

    • 使用extends关键字实现类的继承,子类能继承父类的属性和方法。
    • super关键字允许子类调用父类的构造函数和方法,支持方法覆盖以实现具体化或优化。
    • 构建类的层次结构,促进代码复用和模块化设计。
  4. 静态方法与属性 (Static Methods and Properties):

    • 通过static关键字定义,直接通过类名访问,不依赖于类的实例。
    • 适用于类级别操作和常量数据,如工具函数和配置项。
    • 提高代码组织性和效率,避免了每次实例化时的资源消耗。
  5. Getter和Setter:

    • 提供了一种控制属性访问和修改的机制,增加逻辑验证和灵活性。
    • Getter用于获取属性值,Setter用于设置属性值,并可嵌入验证逻辑。
    • 有助于实现数据验证、格式化和封装,保持数据一致性与安全。

综上所述,JavaScript的class语法通过构造函数、私有特性、继承机制、静态成员以及getter和setter,为开发者提供了一套完整的面向对象编程工具集,支持构建复杂而结构化的应用程序。这些特性不仅提升了代码的可读性和可维护性,也促进了面向对象设计原则在JavaScript中的应用。


🔐 相关链接

  • JavaScript中call、apply与bind详解: JavaScript中call、apply与bind的区别以及使用
  • JavaScript数组常用方法: JavaScript数组全方位探索指南

http://www.ppmy.cn/devtools/37138.html

相关文章

线性滤波和预测理论的新成果【1961.Kalman】翻译

线性滤波和预测理论的新成果 New Results in Linear Filtering and Prediction TheoryR. 线性滤波与预测理论的新结果[j]。 E. KALMAN Study, Baltimore, MarylandResearch Institute for AdvancedR. E.卡尔曼研究&#xff0c;巴尔的摩&#xff0c;马里兰州高级研究所。 S. …

从简单逻辑到复杂计算:感知机的进化与其在现代深度学习和人工智能中的应用(下)

文章目录 第一章&#xff1a;感知机的局限性1.1 异或门的挑战1.2 线性与非线性问题 第二章&#xff1a;多层感知机2.1 已有门电路的组合2.2 实现异或门 第三章&#xff1a;从与非门到计算机 文章文上下两节 从简单逻辑到复杂计算&#xff1a;感知机的进化与其在现代深度学习和人…

Kafka应用Demo:按主题订阅消费消息

安装环境 Kafka安装可参考官方网站的指导(https://kafka.apache.org/quickstart), 按步骤解压压缩包&#xff0c;修改配置。然后再启动zookeeper和kafka-server即可。 需要注意的一点&#xff1a;如果是在VMware虚拟机上启动的kafka, 需要修改一下server.properties配置文件&am…

商城系统秒杀功能设计思想

业务特点 1、瞬时并发量大&#xff0c;秒杀时会有大量用户在同一时间进行抢购&#xff0c;瞬时并发访问量突增几倍、甚至几十倍以上 2、库存量少&#xff0c;一般秒杀活动商品量很少&#xff0c;这就导致了只有极少量用户能成功购买到。 3、业务和流程较为常见&#xff0c;一般…

ros安装cartographer

安装 当然是先去看cartograpger官方文档了&#xff0c;照着说明一步步下来。 执行以下语句会报错&#xff0c; wstool merge -t src https://raw.githubusercontent.com/cartographer-project/cartographer_ros/master/cartographer_ros.rosinstall wstool update -t src参看…

Redis(Redis配置和订阅发布)

文章目录 1.Redis配置1.网络配置1.配置文件位置 /etc/redis.conf2.bind&#xff08;注销支持远程访问&#xff09;1.默认情况bind 127.0.0.1 只能接受本机的访问2.首先编辑配置文件3.进入命令模式输入/bind定位&#xff0c;输入n查找下一个&#xff0c;shift n查找上一个&…

机器学习项目实践-基础知识部分

环境建立 我们做项目第一步就是单独创建一个python环境&#xff0c;Python新的隔离环境 创建&#xff1a;python -m venv ml 使用&#xff1a;.\Scripts\activate python -m venv ml 是在创建一个名为 ml 的虚拟环境&#xff0c;这样系统会自动创建一个文件夹ml&#xff0c;…

自学错误合集--项目打包报错,运行报错持续更新中

java后端自学错误总结 一.项目打包报错2.项目打包之后运行报错 二.项目运行报错 一.项目打包报错 javac: &#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ļ&#xfffd;: E:\xx\xx\xx\docer-xx\src\main\java\xx\xx\xx\xx\xx\xx.java &#xfffd;&#xff…