JavaScript对象设计哲学:八种模式塑造高效代码

news2025/1/22 14:44:21

在这里插入图片描述

🔥 个人主页:空白诗

在这里插入图片描述

文章目录

    • 一、引言 🚀
    • 二、Object 构造函数 🧱
      • 📌 基本用法
      • 📌 重要性
      • 📌 实际应用案例
    • 三、对象字面量 📘
      • 📌 定义属性
      • 📌 定义方法
      • 📌 属性特性
      • 📌 注意事项
    • 四、Object.create() 🔗
      • 📌 基本用法
      • 📌 关键点
      • 📌 优点
      • 📌 注意事项
    • 五、类(ES6)🏫
      • 📌 基本结构
      • 📌 关键特性
      • 📌 重要概念
    • 六、工厂模式 🏭
      • 📌 基本实现
      • 📌 优势
      • 📌 应用场景
      • 📌 注意事项
    • 七、构造函数模式 🔨
      • 📌 基本用法
      • 📌 核心特点
      • 📌 优缺点
      • 📌 解决方法重定义问题
    • 八、原型模式 🧬
      • 📌 基础概念
      • 📌 核心原理
      • 📌 优点
      • 📌 缺点
      • 📌 使用建议
    • 九、组合模式 🌈
      • 📌 示例解析
      • 📌 组合模式的优势
      • 📌 应用场景
    • 十、总结 🎯
    • 🔗 相关知识


在这里插入图片描述


一、引言 🚀

JavaScript编程的广阔天地里,对象作为构建复杂应用的基石,其创建与管理是每个开发者必须掌握的核心技能。本文将带你深入探索对象创建的八大途径,从经典到现代,全方位覆盖,助你灵活运用,打造健壮高效的代码结构。

对象JavaScript中一种复合数据类型,能够存储多个不同数据类型的值。它们不仅存储数据,还封装了方法,即可以直接在对象上执行的功能。了解多种创建对象的方法,对于编写清晰、可维护的代码至关重要。接下来,让我们一一揭开这些方法的神秘面纱。🔍


二、Object 构造函数 🧱

Object构造函数是JavaScript中最基础的对象创建方式,虽然在日常开发中不如对象字面量那样频繁使用,但它对于深入理解JavaScript的对象模型和原型链机制具有重要意义。

📌 基本用法

const obj = new Object(); // 创建一个空对象
obj.key = 'value'; // 动态添加属性
console.log(obj); // 输出:{ key: 'value' }

📌 重要性

  1. 理解对象本质:通过Object构造函数创建对象,可以帮助开发者从底层认识对象如何在JavaScript中被构造,进而深入理解原型链的概念。

  2. 动态性展示:上面的示例展示了JavaScript对象的动态性,即可以在对象创建后随时添加或修改属性和方法。

  3. 与其他方法对比:与对象字面量相比,Object构造函数显得冗余,但在某些特定场景下,如通过函数动态生成对象时,它展现了灵活性。

  4. 与其他构造函数的关系:所有JavaScript的构造函数(包括自定义构造函数)在原型链的顶端都指向Object.prototype,这意味着所有对象最终都是Object的实例,凸显了Object构造函数的基础地位。

📌 实际应用案例

在某些高级应用中,如需要基于条件创建具有不同属性的对象时,Object构造函数配合逻辑判断可以提供灵活性。

```javascript
/**
 * 创建一个具有条件属性的对象。
 * 
 * 根据传入的isAdmin参数决定对象是否包含管理员专有属性。
 * 
 * @param {boolean} isAdmin - 一个布尔值,指示用户是否为管理员。
 * @returns {object} 返回一个对象,包含commonProperty和可选的adminProperty。
 */
function createCustomObject(isAdmin) {
  // 使用Object构造函数创建一个新的空对象
  const obj = new Object();
  
  // 添加所有对象共有的属性
  obj.commonProperty = 'sharedValue';
  
  // 根据isAdmin的值决定是否添加管理员专有属性
  if (isAdmin) {
    obj.adminProperty = 'adminOnlyValue';
  }
  
  // 返回配置好的对象
  return obj;
}

// 调用函数并传入true,表示创建一个管理员对象
const userObj = createCustomObject(true);

// 打印输出用户对象,根据isAdmin参数,可能包含adminProperty
console.log(userObj); // 输出为:{ commonProperty: 'sharedValue', adminProperty: 'adminOnlyValue' }

尽管直接使用对象字面量通常更为简便,理解并掌握Object构造函数对于深化JavaScript对象知识体系、特别是在处理更复杂的对象创建逻辑时,是不可或缺的一环。它不仅体现了JavaScript的动态性,也是通往更高级对象操作和理解原型继承机制的基石。


三、对象字面量 📘

对象字面量是JavaScript中创建单个对象的一种非常直接且简洁的方法。它允许你通过一对花括号 {} 来直观地定义一个对象的属性和方法。这种方式因其简洁性和易读性而被广泛使用。下面是关于对象字面量的一些关键点和扩展说明:

📌 定义属性

  • 直接赋值:如示例所示,你可以直接在花括号内键值对的形式定义属性。键(即属性名)后面跟一个冒号,然后是该属性的值。
const person = {
  name: 'Alice', // 字符串属性
  age: 30,       // 数字属性
};

📌 定义方法

  • 函数作为值:对象的属性也可以是一个函数,这种情况下通常称为“方法”。定义方法时,只需像定义普通属性那样给出名称,并将其值设置为一个函数表达式。
greet: function() {
  console.log('Hello, my name is ' + this.name);
}
  • 简写方法语法ES6引入了更简洁的方法定义方式,允许你省略function关键字和冒号。
const person = {
  name: 'Alice',
  age: 30,
  greet() { // 简写方法定义
    console.log(`Hello, my name is ${this.name}`);
  }
};

访问和修改属性

  • 点符号访问:可以通过点符号(.)访问对象的属性和方法。
console.log(person.name); // 访问属性
person.greet();           // 调用方法
  • 方括号 [ ]:对于动态属性名或包含特殊字符的属性名,可以使用方括号表示法。
const key = 'name';
console.log(person[key]); // 动态访问属性

📌 属性特性

  • getter 和 setter:可以定义访问器属性(gettersetter),用于在获取或设置属性值时执行某些操作。
const person = {
  _name: 'Alice', // 使用下划线前缀表示私有属性是一种约定
  get name() { // getter
    return this._name;
  },
  set name(value) { // setter
    if (value.trim() === '') {
      throw new Error('Name cannot be empty');
    }
    this._name = value;
  }
};

person.name = ' Bob '; // 自动去除首尾空格
console.log(person.name); // 输出:Bob

📌 注意事项

  • this关键字:在对象方法中,this关键字指向调用该方法的对象。但在箭头函数中,this由其定义时的上下文决定,而非调用时的上下文,因此箭头函数通常不用于定义对象的方法。

通过对象字面量,你可以快速构造出结构清晰、易于理解的对象结构,是JavaScript面向对象编程的基础之一。


四、Object.create() 🔗

Object.create() 方法是ECMAScript标准中提供的一种高级对象创建方式,它直接体现了JavaScript的原型继承机制。这个方法允许你以一个对象作为原型(prototype),创建一个新对象,新对象将继承原型的所有可枚举属性和方法。这种方式非常适合构建复杂的继承结构,尤其是在需要明确控制原型链的情况下。

📌 基本用法

const personProto = {
  greet: function() {
    console.log('Hello, I am a person.');
  }
};

const john = Object.create(personProto);
john.name = 'John Doe';
john.greet(); // 输出:Hello, I am a person.

📌 关键点

  1. 原型对象 (personProto): 这是新创建对象的原型。新对象将从这个对象继承属性和方法。在这个例子中,personProto有一个greet方法。

  2. 新对象创建 (john): 通过调用 Object.create(personProto) 创建了一个新对象,并将其原型链的顶部设置为personProto。这意味着john对象可以访问personProto上定义的所有属性和方法。

  3. 属性添加 (john.name): 我们可以直接在新对象上添加属性,而不会影响原型对象。这里给john添加了一个name属性。

  4. 方法调用 (john.greet()): 尽管greet方法不是直接定义在john上,但由于原型链的存在,john可以访问并调用它。

📌 优点

  • 原型隔离:可以避免直接修改原型链上的对象,保持原型的纯净性。
  • 灵活性:能够创建多个具有相同行为但状态不同的对象,只需更改各自的状态属性。
  • 易于理解的原型链:清晰地展示了对象之间的继承关系,便于调试和理解代码结构。

📌 注意事项

  • 原型污染风险:如果原型对象被误修改,所有通过该原型创建的对象都会受到影响。
  • 非构造函数继承:不同于使用new操作符和构造函数,Object.create()不执行构造函数体内的代码,仅复制原型链。

Object.create() 是理解JavaScript原型继承机制的一个重要工具,它在需要灵活控制对象原型时尤为有用,是构建复杂对象关系的理想选择。


五、类(ES6)🏫

随着ECMAScript 2015(简称ES6)的到来,JavaScript正式引入了“类”(class)这一概念,为开发者提供了一种更接近传统面向对象语言的语法来定义和创建对象。尽管本质上仍然是基于原型的继承,但“类”为JavaScript带来了更加清晰、简洁的语法糖,使得面向对象编程变得更加直观。

📌 基本结构

class Person {
  constructor(name) {
    this.name = name; // 初始化属性
  }
  
  greet() {
    console.log(`Hello, I'm ${this.name}.`); // 定义方法
  }
}

const jane = new Person('Jane'); // 创建实例
jane.greet(); // 输出:Hello, I'm Jane.

📌 关键特性

  • constructor方法:这是类的构造函数,用于初始化新创建的对象。当使用new关键字创建类的实例时自动调用。

  • 方法定义:直接在类体内定义的方法,不需要使用function关键字,也无需像对象字面量那样将方法挂载到this上。

  • 继承:ES6的类还引入了extends关键字,用于实现继承,简化了原型链的继承过程。

class Student extends Person {
  constructor(name, grade) {
    super(name); // 调用父类构造函数
    this.grade = grade;
  }
  
  study() {
    console.log(`${this.name} is studying in grade ${this.grade}.`);
  }
}

const tom = new Student('Tom', 10);
tom.greet(); // 继承自Person类
tom.study();

📌 重要概念

  • super关键字:在子类中用于调用父类的构造函数或方法,是继承机制中的关键部分。

  • 静态方法:使用static关键字定义,属于类本身而不是实例,通过类名直接调用。

class Greeting {
  static hello() {
    console.log('Hello from the class!');
  }
}

Greeting.hello(); // 静态方法调用

ES6的类为JavaScript带来了一种更符合传统面向对象编程习惯的语法,提高了代码的可读性和可维护性。虽然其背后仍然是基于原型的继承机制,但“类”提供了一层更抽象、更易理解的接口,使得对象创建和继承的逻辑更加清晰。无论是对于初学者还是经验丰富的开发者,掌握ES6类都是提升JavaScript编程效率和代码质量的重要一步。


六、工厂模式 🏭

工厂模式是软件工程中一种常用的设计模式,它在JavaScript中用于创建对象时,通过函数(工厂函数)封装对象实例化的过程,从而隐藏了具体的创建逻辑,提高了代码的灵活性和可维护性。这种方法特别适合于需要创建多个相似对象的情况,同时又想减少重复代码。

📌 基本实现

function createPerson(name) {
  // 工厂函数:接收参数并返回一个包含该属性的对象
  return {
    name: name, // 动态设置对象的属性
    greet: function() {
      console.log(`Hi, I'm ${this.name}`); // 定义对象的方法
    }
  };
}

const mike = createPerson('Mike'); // 使用工厂函数创建对象
mike.greet(); // 输出:Hi, I'm Mike

📌 优势

  1. 封装性:工厂函数封装了对象创建的细节,使得调用者不需要关心对象是如何创建的,只需要知道如何使用它。

  2. 灵活性:容易扩展以创建不同类型的对象。只需修改或增加工厂函数即可创建具有不同属性或方法的对象,而无需改变客户端代码。

  3. 代码复用:对于具有相同属性或方法的对象,可以通过工厂函数复用这些通用部分,减少代码重复。

📌 应用场景

  • 当你需要创建多个相似但不完全相同的对象时,比如创建多个不同用户对象,每个用户有不同的名字和角色,但都有共同的属性(如greet方法)和一些不同的属性。

📌 注意事项

  • 对象识别问题:由于所有对象都是通过同一个工厂函数创建,它们没有一个显式的构造函数或类型标识,因此难以识别对象的具体类型。

  • 原型链未利用:工厂模式直接创建并返回对象字面量,没有利用JavaScript的原型链机制,可能导致内存占用稍大,尤其是在创建大量对象时。

工厂模式是JavaScript中实现对象创建的一种经典策略,通过它可以在不暴露内部创建逻辑的同时,提供一致的接口来生产对象,是实现解耦和代码复用的有效手段。


七、构造函数模式 🔨

构造函数模式是JavaScript中实现面向对象编程的一种基本方法,它利用自定义构造函数和new操作符来创建特定类型的对象实例。每个通过构造函数创建的对象都会拥有独立的属性副本和方法,适合于创建多个同类型但相互独立的对象。

📌 基本用法

function Person(name) {
  // 构造函数:初始化新对象的属性
  this.name = name;

  // 为每个实例定义方法
  this.greet = function() {
    console.log(`Hello, I'm ${this.name}.`);
  };
}

const anna = new Person('Anna'); // 使用new关键字创建实例
anna.greet(); // 输出:Hello, I'm Anna.

📌 核心特点

  1. 构造函数:以大写字母开头命名的函数,用于初始化新创建的对象的属性。

  2. this关键字:在构造函数内部,this指向新创建的对象实例。

  3. 独立性:每个实例都有自己的属性和方法副本,互不影响。

  4. new操作符:创建实例时必须使用,它负责创建空对象、绑定this并返回新对象。

📌 优缺点

  • 优点

    • 易于理解和使用,符合传统的面向对象编程习惯。
    • 可以为每个实例分配独立的属性,适合处理大量相似对象。
  • 缺点

    • 每个实例上的方法都是独立的,导致内存开销大,尤其是方法较多时。
    • 不利于函数复用,因为方法定义在构造函数内部。

📌 解决方法重定义问题

为了解决方法重复定义导致的内存浪费,可以利用原型链(prototype)来共享方法:

function Person(name) {
  this.name = name;
}

Person.prototype.greet = function() {
  console.log(`Hello, I'm ${this.name}.`);
};

const bob = new Person('Bob');
bob.greet(); // 输出:Hello, I'm Bob.

通过将方法定义在构造函数的prototype属性上,所有实例可以共享这些方法,从而节省内存。

构造函数模式JavaScript面向对象编程的基石之一,它允许开发者以更面向对象的方式组织代码,通过构造函数和原型链的结合,可以灵活地创建和管理对象。


八、原型模式 🧬

原型模式JavaScript中实现继承和方法复用的核心机制,通过利用对象的原型链,可以让所有实例共享同一组属性和方法,有效减少内存消耗,提高程序效率。每个JavaScript函数都有一个内置的prototype属性,这个属性是一个对象,用于存放所有实例共享的属性和方法。

📌 基础概念

function Person() {} // 构造函数

// 设置原型上的属性和方法
Person.prototype.name = 'Prototype User';
Person.prototype.greet = function() {
  console.log(`Greetings, I'm ${this.name}.`);
};

const emily = new Person(); // 创建实例
emily.greet(); // 输出:Greetings, I'm Prototype User.

📌 核心原理

  • 原型链:每当创建一个新对象,该对象会自动链接到其构造函数的prototype对象,形成一条原型链。这使得对象可以访问其原型上的属性和方法。

  • 共享方法:在原型上定义的方法对所有实例来说只有一份副本,节省内存。

  • 修改原型:原型上的属性和方法可以在构造函数定义之后被添加或修改,影响所有已存在的实例。

📌 优点

  1. 内存效率:方法在内存中只存在一份,所有实例共享,大大减少了内存使用。
  2. 动态扩展:可以在运行时向原型添加方法,立即对所有实例生效。
  3. 易于理解的继承:通过原型链实现简单的继承结构,易于管理和扩展。

📌 缺点

  • 原型污染:修改原型会影响所有实例,可能导致意外的行为变化。
  • 访问冲突:直接修改原型上的共有属性会影响所有实例,除非使用实例自身属性来覆写。
  • 查找性能:访问原型链上的属性可能会有轻微的性能开销,尤其是在链较长时。

📌 使用建议

  • 区分公私:尽量将不变的或共享的方法放在原型上,而实例特有的属性直接在构造函数内初始化。
  • 谨慎修改原型:考虑原型修改对已有实例的影响,尽量在设计初期完成原型的定义。

原型模式JavaScript面向对象编程的重要组成部分,通过巧妙利用原型链,可以构建高效、灵活的对象系统,理解并掌握这一模式是每位JavaScript开发者进阶的必经之路。


九、组合模式 🌈

组合模式JavaScript中体现为灵活结合多种对象创建技术,以优化代码结构、提高性能和可维护性。这种模式鼓励开发者根据具体需求,创造性地融合构造函数、原型、闭包、类等机制,实现复杂功能的同时保持代码的清晰和高效。

下面通过一个结合构造函数模式与原型模式的例子,展示如何在保证私有变量安全的同时,共享方法以减少内存消耗。

📌 示例解析

function Person(name) {
  // 使用闭包创建私有变量
  let _name = name; // 下划线前缀提示这是一个“私有”变量

  // 公共方法访问私有变量,通过闭包捕获
  this.getName = function() {
    return _name;
  };
}

// 利用原型链共享方法,减少内存占用
Person.prototype.greet = function() {
  console.log(`Hello, I'm ${this.getName()}.`);
};

const sam = new Person('Sam');
sam.greet(); // 输出:Hello, I'm Sam.

📌 组合模式的优势

  1. 灵活性:根据不同场景,自由搭配最适合的创建方式,既可保证代码的可读性,又能满足性能需求。

  2. 优化内存使用:通过原型链共享方法,避免了每个实例重复创建相同方法,节省内存资源。

  3. 封装性增强:结合闭包等技术,可以有效隐藏内部实现细节,保护数据安全,实现更高级别的封装。

📌 应用场景

  • 当你需要创建一组具有相似功能的对象,但又希望它们各自拥有独立状态或私有数据时。
  • 在构建大型应用框架或库时,为了平衡性能与易用性,经常采用组合模式来设计对象系统。

组合模式展示了JavaScript在对象设计上的灵活性,鼓励开发者根据实际情况,创造性地结合不同的设计模式和技术,以达到既满足功能需求,又优化性能和可维护性的目的。通过熟练运用组合模式,可以使你的JavaScript代码更加健壮、高效,适应各种复杂的项目需求。


十、总结 🎯

在这次深入探索之旅中,我们遍历了JavaScript对象创建的八种核心路径,每一步都揭示了这门语言在灵活性与表现力上的独到之处。从基础的Object构造函数到直观的对象字面量,再到进阶的Object.create()ES6类,以及设计模式中的工厂模式、构造函数模式、原型模式,直至灵活多变的组合模式,每一种方法都在不同的场景下绽放着光彩。

  • 对象字面量 以其简洁明了赢得了日常开发的青睐。
  • 构造函数与原型模式 结合,展现了面向对象编程的精髓。
  • ES6类 简化了继承结构,让面向对象设计更加贴近传统风格。
  • 工厂模式 强调了封装与灵活性。
  • Object.create() 直击原型链核心,强化了继承的概念。
  • 组合模式 则教会了我们如何综合运用多种技巧,达到最优的代码结构和性能平衡。

掌握这些方法,不仅仅是技术的堆砌,更是理解JavaScript内在机制、面向对象设计思想以及代码组织艺术的深刻体现。在实战中,根据项目需求灵活选择最适合的创建方式,是每一位开发者追求的境界。记住,每一块代码都是一次创造的机会,每一次实践都是通往卓越的桥梁。


🔗 相关知识

  • JavaScript 中的 Class 类
  • JavaScript中call、apply与bind的区别
  • JavaScript 垃圾回收机制深度解析:内存管理的艺术
  • 深入浅出JavaScript继承机制:解密原型、原型链与面向对象实战攻略
  • 深入理解JavaScript事件循环Event Loop:宏任务与微任务的奇幻之旅
  • JavaScript 防抖与节流——以游戏智慧解锁实战奥秘
  • JavaScript基础知识强化:变量提升、作用域逻辑及TDZ的全面解析

在这里插入图片描述

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

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

相关文章

基于Spring封装一个websocket工具类使用事件发布进行解耦和管理

最近工作中,需要将原先的Http请求换成WebSocket,故此需要使用到WebSocket与前端交互。故此这边需要研究一下WebSocket到底有何优点和不可替代性: WebSocket优点: WebSocket 协议提供了一种在客户端和服务器之间进行全双工通信的…

制氧机负离子的作用与好处深度解析

随着现代生活节奏的加快,空气质量逐渐下降,人们对健康生活的追求也日益增强。在这样的背景下,制氧机负离子功能因其多重健康效益而备受关注。本文将深入探讨制氧机负离子的作用与功效,帮助大家更好地了解并应用这一健康科技。 我们…

Win11环境下,AirSim和UE4安装

这里主要描述一下我前段时间成功安装AirSim和UE4的流程,中间也遇到过一些问题,刚开始我安装的是最新的UE5,但是不知道什么情况运行AirSim中的blocks模块始终没有成功,VisualStudio中提示Unable to find plugin PhysXVehicles &…

回收站删除的文件怎么恢复?6个恢复技巧记得收藏!

“回收站删除的文件还有机会恢复吗?应该怎么操作才能恢复回收站里删除的文件呀?本人纯小白,希望大家推荐几个简单易懂的恢复方法。” 在使用电脑的过程中,我们时常会不小心将重要文件误删到回收站,甚至直接从回收站中彻…

AI预测体彩排3采取878定位大底=23策略+杀断组+杀组选+杀和尾+杀和值012缩水测试5月16日预测第2弹

昨天的87823大底测试第一次测试,已经成功命中! 今天继续测试,仍旧目标为:10期中至少5中期。好了,废话不多说了,直接上结果吧~ 首先,878定位如下: 百位:4,5,6,3,8,1,9,0…

控制台的高度可调有哪些重要意义解析

在现代办公环境中,控制台的高度可调性越来越受到重视。它不仅为员工提供了更加舒适的工作环境,还提高了工作效率和生产力。本文将详细探讨控制台高度可调的重要性,并解析其在实际应用中的优势。 个性化适应需求 对于长时间在控制台前工作的用…

Kubernetes入门:应用部署方式的演变

Kubernetes:管理云平台中 多主机的 容器化应用的平台。 应用部署方式的演变 传统部署 互联网早期,会直接将应用程序部署在物理机上 优点:简单,不需要其它技术的参与 缺点:无法为物理服务器中的应用程序定义资源边…

用AI帮你写简历,入职啦简历编辑器

简历的重要性 在当前就业形势严峻、竞争加剧的背景下,获取理想工作的难度与日俱增。此时,一份精心准备、亮点突出的简历,成为了您脱颖而出、成功获得面试机会乃至工作offer的关键。面对HR有限的审阅时间和众多应聘者的激烈角逐,如…

Flink LookupJoin攒批查询

Flink LookupJoin攒批查询 需求背景 使用Lookup Join进行维表关联时,流表数据需要实时与维表数据进行关联。使用Cache会导致数据关联不准确,不使用Cache会造成数据库服务压力。攒批查询是指攒够一定批数量的数据,相同的查询Key只查询一次&a…

苹果永久版安装PD虚拟机:Parallels Desktop 19 一键激活版

Parallels Desktop 19是一款功能强大的虚拟机软件,专为Mac用户设计,允许用户在同一台Mac电脑上同时运行Windows、Linux等多个操作系统,而无需额外的硬件设备。 下载地址:https://www.macz.com/mac/9581.html?idOTI2NjQ5Jl8mMjcuM…

力扣HOT100 - 32. 最长有效括号

解题思路&#xff1a; 栈 class Solution {public int longestValidParentheses(String s) {int max 0;// 也可以使用 Stack<Integer> stacknew Stack<>();但Stack是遗留类&#xff0c;不推荐Deque<Integer> stack new LinkedList<>();stack.push(…

Nginx HTTPS配置:一篇文章解决所有痛点

你好呀&#xff0c;我是赵兴晨&#xff0c;文科程序员。 今天&#xff0c;我将与大家分享一些关于Nginx的实用知识。这次的主题是&#xff1a;如何为Nginx配置HTTPS。我将从HTTP与HTTPS的区别讲起&#xff0c;然后逐步介绍Nginx的安装与HTTPS配置的详细步骤。 HTTP与HTTPS的区…

Github项目部署到自己的域名

天坑&#xff0c;买的是华为的域名&#xff0c;不过新用户才一块&#xff0c;就忍了 要买个域名&#xff0c;我买的是华为的&#xff08;此处是购买地址&#xff09; 购买后去控制台&#xff0c;点击“总览”进入域名页面 点击想要修改的域名后的“管理解析” 点击快速解析&…

vant添加列表, 日期选择总是填充到最后一个组内原因

添加多个行程, 无论在哪个行程上修改时间, 时间总是只显示在最后一个行程里 错误代码: <div class"journey"><divv-for"(item, index) in ruleform.hrms_business_item":key"index"><div class"journey-title">&l…

人工智能创新领衔,Android系统如虎添翼:2024 Google I/O 大会深度解析

人工智能创新领衔&#xff0c;Android系统如虎添翼&#xff1a;2024 Google I/O 大会深度解析 2024年5月14日举行的Google I/O大会&#xff0c;犹如一场精彩的科技盛宴&#xff0c;吸引了全球的目光。大会上&#xff0c;谷歌发布了一系列重磅产品和技术更新&#xff0c;展现了…

TMC4671超越传感器和摄像头之外——将物联网从云端转移到现实世界[应用案例]

在早期&#xff0c;物联网 (IoT) 在很大程度上充当了云端服务的“眼睛和耳朵”&#xff0c;收集传感器、摄像头和其他物理世界输入设备的数据&#xff0c;而不太注重操纵或控制它所监视的事物。支持物联网的自动化和机器人应用已经开始合并&#xff0c;但是一般而言&#xff0c…

SIP-7041 20W SIP广播网络有源音箱 校园广播20W木质SIP音箱

SIP-7041 20W SIP广播网络有源音箱 校园广播20W木质SIP音箱 一、描述 SIP-7041 20W SIP广播网络有源音箱 支持标准SIP协议 SIP-7041是我司的一款壁挂式网络有源音箱&#xff0c;具有10/100M以太网接口&#xff0c;可将网络音源通过自带的功放和喇叭输出播放&#xff0c;可达到…

win10专业版或者企业版安装docker,亲测过,请放心安装

in10专业版系统首先需要开启硬件虚拟化及Hyper-V功能&#xff0c;才能进行Docker for Windows软件安装 1.鼠标在桌面最下面&#xff0c;右击–任务管理器—性能—虚拟化&#xff08;已启用&#xff09;&#xff0c;看到这个已启用就说明OK啦&#xff1b; 2.win10系统&#xff…

iPhone携手ChatGPT?苹果OpenAI或将强强联手

近年来&#xff0c;人工智能技术的蓬勃发展掀起了一场席卷全球的科技浪潮&#xff0c;而智能手机作为人们日常生活中不可或缺的一部分&#xff0c;自然成为了这场AI竞赛的重要战场。各大科技巨头纷纷加码布局&#xff0c;力图在AI领域占据领先地位。 近日&#xff0c;据知情人士…

STAR-Echo:一种使用时空分析和基于Transformer的影像组学模型预后慢性肾脏病患者 MACE 预后的新型生物标志物

文章目录 STAR-Echo: A Novel Biomarker for Prognosis of MACE in Chronic Kidney Disease Patients Using Spatiotemporal Analysis and Transformer-Based Radiomics Models摘要方法实验结果 STAR-Echo: A Novel Biomarker for Prognosis of MACE in Chronic Kidney Disease…