JavaScript 中动态创建和管理对象实例的策略

JavaScript 中动态创建和管理对象实例的策略

本文旨在探讨在JavaScript中如何根据数组中的值动态创建类的多个实例。我们将介绍两种主流且推荐的策略:将实例存储在数组中,可以使用for…of循环或更简洁的Array.prototype.map方法;或者将实例存储在一个对象(哈希映射)中,以便通过键名直接访问。文章将提供详细的代码示例,并强调避免全局变量污染等最佳实践,帮助开发者高效、规范地管理动态生成的对象集合。

javascript开发中,我们经常会遇到需要根据一组数据(例如id列表、配置项等)来动态创建多个对象实例的场景。传统的做法是手动为每个实例声明一个变量,例如 let mass = new input_for_calc(‘mass’);。然而,当数据量较大或数据来源是动态时,这种手动方式显然效率低下且难以维护。开发者往往会尝试使用循环来自动化这一过程,但可能会遇到如何为动态生成的实例赋予变量名的问题,例如尝试 let ? = new input_for_calc(‘id’);。直接在循环内部动态创建全局变量名是一种不推荐的做法,因为它会导致全局作用域污染,增加命名冲突的风险,并降低代码的可维护性。

本教程将介绍两种更规范、更健壮的策略来解决这个问题:将动态创建的实例存储在一个数组中,或者存储在一个对象(哈希映射)中。

定义基础类

首先,我们定义一个用于创建实例的基础类 Input_for_calc。这个类接收一个 id 作为构造参数,并包含一些模拟DOM操作的方法。

class Input_for_calc {    constructor (id) {        // 存储带有 '#' 前缀的ID,通常用于querySelector        this.id_obgect = "#" + id;    }    // 查询DOM元素(注意:此方法当前未返回查询结果)    document_qs() {        document.querySelector(`${this.id_obgect}`);    }    // 设置元素的显示样式为 'block'    style_block() {        document.querySelector(`${this.id_obgect}`).style.display = "block";    }    // 设置元素的显示样式为 'none'    style_none() {        document.querySelector(`${this.id_obgect}`).style.display = "none";    }    // 获取元素的当前值(注意:此方法当前未返回获取的值)    value() {        document.querySelector(`${this.id_obgect}`).value;    }}// 假设我们有一组需要创建实例的IDlet oll_calc_input_id = ["mass", "mol_mass", "volum", "calculate", "widp"];

请注意,document_qs() 和 value() 方法在当前实现中并没有返回任何值,也没有将查询到的元素或值存储在实例属性中,这可能不是预期行为。在实际应用中,你可能需要根据需求修改它们以返回或存储相关信息。本教程的重点在于实例的动态创建和管理。

策略一:使用数组存储对象实例

当我们需要一个有序的集合,或者主要通过索引来访问这些实例时,将它们存储在一个数组中是最佳选择。

立即学习“Java免费学习笔记(深入)”;

方法一:使用 for…of 循环

for…of 循环提供了一种简洁的方式来遍历可迭代对象(如数组),并对每个元素执行操作。我们可以利用它来遍历ID数组,并为每个ID创建一个 Input_for_calc 实例,然后将其添加到新数组中。

// 创建一个空数组来存储Input_for_calc实例let objs = [];// 遍历ID数组,并为每个ID创建一个新实例for (const input of oll_calc_input_id) {    objs.push(new Input_for_calc(input));}// 打印结果,可以看到objs现在是一个包含Input_for_calc实例的数组console.log(objs);// 示例:访问数组中的第一个实例// console.log(objs[0]); // 对应 'mass' 的实例// 示例:调用实例的方法// objs[0].style_block(); // 假设页面中存在id为'mass'的元素

这种方法直观易懂,适用于任何需要迭代并收集结果的场景。

方法二:使用 Array.prototype.map

对于将一个数组中的每个元素转换(映射)成另一个新元素并形成一个新数组的需求,Array.prototype.map 是更具函数式编程风格且更简洁的选择。它专门为此目的而设计。

// 使用 map 方法直接将ID数组转换为Input_for_calc实例数组let mappedObjs = oll_calc_input_id.map(input => new Input_for_calc(input));// 打印结果,mappedObjs与上面for...of循环得到的objs相同console.log(mappedObjs);// 示例:访问数组中的第二个实例// console.log(mappedObjs[1]); // 对应 'mol_mass' 的实例

map 方法的代码更紧凑,表达意图更清晰,是处理此类转换任务的首选。

策略二:使用对象(哈希映射)存储对象实例

有时,我们可能希望通过一个有意义的键名(例如ID本身)来直接访问特定的实例,而不是通过数字索引。在这种情况下,将实例存储在一个普通JavaScript对象(作为哈希映射或字典)中是更合适的选择。

// 创建一个空对象来存储Input_for_calc实例let inputs = {};// 遍历ID数组,并使用ID作为键名,将新实例作为值存储到对象中for (const input of oll_calc_input_id) {    inputs[input] = new Input_for_calc(input);}// 打印结果,inputs现在是一个键值对为 'ID: Input_for_calc实例' 的对象console.log(inputs);// 示例:通过键名直接访问实例console.log(inputs.mass);      // 访问 'mass' 对应的实例console.log(inputs.mol_mass);  // 访问 'mol_mass' 对应的实例// 示例:调用特定实例的方法// inputs.mass.style_block(); // 假设页面中存在id为'mass'的元素

这种方法允许你像访问对象属性一样,通过实例的原始ID来访问它,例如 inputs.mass 或 inputs[‘mol_mass’]。这对于需要根据特定标识符快速查找和操作实例的场景非常有用。

注意事项与最佳实践

避免全局变量污染: 绝对不要尝试通过 window[variableName] = new Class() 的方式来动态创建全局变量。这会导致全局作用域变得混乱,增加命名冲突的风险,并使代码难以理解和维护。本教程中介绍的数组和对象存储方式是更安全、更推荐的做法。选择合适的存储结构:如果实例之间存在逻辑上的顺序关系,或者你需要频繁地遍历所有实例,或者通过索引访问,那么数组是更好的选择。如果每个实例都有一个唯一的、有意义的标识符,并且你需要通过这个标识符快速查找和访问特定实例,那么对象(哈希映射)是更优的选择。代码可读性与维护性: 使用 Array.prototype.map 通常能使代码更简洁、意图更清晰,尤其是在进行一对一转换时。而 for…of 循环则提供了更大的灵活性,可以在循环体内执行更复杂的操作。选择哪种方式取决于具体的业务逻辑和个人偏好。方法链与返回值: 在 Input_for_calc 类中,document_qs() 和 value() 方法没有返回查询到的DOM元素或其值。在实际应用中,如果希望这些方法能够被链式调用或提供数据,需要确保它们有合适的返回值。例如:

document_qs() {    return document.querySelector(`${this.id_obgect}`);}value() {    const element = this.document_qs();    return element ? element.value : undefined;}

总结

动态创建和管理对象实例是JavaScript开发中的常见需求。通过将实例存储在数组或对象(哈希映射)中,我们可以避免全局变量污染的弊端,并根据实际需求选择最合适的访问方式。

对于需要有序集合或通过索引访问的场景,数组(结合 for…of 或 Array.prototype.map)是理想选择。对于需要通过有意义的键名快速访问特定实例的场景,对象(哈希映射)是更优方案。

掌握这些策略将帮助你编写出更健壮、更易于维护的JavaScript代码。

以上就是JavaScript 中动态创建和管理对象实例的策略的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1513716.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月20日 07:56:03
下一篇 2025年12月20日 07:56:17

相关推荐

  • 前端代码辅助工具:如何选择最可靠的AI工具?

    前端代码辅助工具:可靠性探讨 对于前端工程师来说,在HTML、CSS和JavaScript开发中借助AI工具是司空见惯的事情。然而,并非所有工具都能提供同等的可靠性。 个性化需求 关于哪个AI工具最可靠,这个问题没有一刀切的答案。每个人的使用习惯和项目需求各不相同。以下是一些影响选择的重要因素: 立…

    2025年12月24日
    300
  • 如何直接访问 Sass 地图变量的值?

    直接访问 sass 地图变量的值 在 sass 中,我们可以使用地图变量来存储一组键值对。而有时候,我们可能需要直接访问其中的某个值。 可以通过 map-get 函数直接从地图中获取特定的值。语法如下: map-get($map, $key) 其中: $map 是我们要获取值的 sass 地图变量。…

    2025年12月24日
    000
  • 您不需要 CSS 预处理器

    原生 css 在最近几个月/几年里取得了长足的进步。在这篇文章中,我将回顾人们使用 sass、less 和 stylus 等 css 预处理器的主要原因,并向您展示如何使用原生 css 完成这些相同的事情。 分隔文件 分离文件是人们使用预处理器的主要原因之一。尽管您已经能够将另一个文件导入到 css…

    2025年12月24日
    000
  • React 嵌套组件中,CSS 样式会互相影响吗?

    react 嵌套组件 css 穿透影响 在 react 中,嵌套组件的 css 样式是否会相互影响,取决于采用的 css 解决方案。 传统 css 如果使用传统的 css,在嵌套组件中定义的样式可能会穿透影响到父组件。例如,在给出的代码中: 立即学习“前端免费学习笔记(深入)”; component…

    2025年12月24日
    000
  • React 嵌套组件中父组件 CSS 修饰会影响子组件样式吗?

    对嵌套组件的 CSS 修饰是否影响子组件样式 提问: 在 React 中,如果对嵌套组件 ComponentA 配置 CSS 修饰,是否会影响到其子组件 ComponentB 的样式?ComponentA 是由 HTML 元素(如 div)组成的。 回答: 立即学习“前端免费学习笔记(深入)”; 在…

    2025年12月24日
    000
  • 什么是功能类优先的 CSS 框架?

    理解功能类优先 tailwind css 是一款功能类优先的 css 框架,用户可以通过组合功能类轻松构建设计。为了理解功能类优先,我们首先要区分语义类和功能类这两种 css 类名命名方式。 语义类 以前比较常见的 css 命名方式是根据页面中模块的功能来命名。例如: 立即学习“前端免费学习笔记(深…

    2025年12月24日
    000
  • SCSS – 增强您的 CSS 工作流程

    在本文中,我们将探索 scss (sassy css),这是一个 css 预处理器,它通过允许变量、嵌套规则、mixins、函数等来扩展 css 的功能。 scss 使 css 的编写和维护变得更加容易,尤其是对于大型项目。 1.什么是scss? scss 是 sass(syntropically …

    2025年12月24日
    000
  • 在 React 项目中实现 CSS 模块

    react 中的 css 模块是一种通过自动生成唯一的类名来确定 css 范围的方法。这可以防止大型应用程序中的类名冲突并允许模块化样式。以下是在 react 项目中使用 css 模块的方法: 1. 设置 默认情况下,react 支持 css 模块。你只需要用扩展名 .module.css 命名你的…

    2025年12月24日
    000
  • 我如何编写 CSS 选择器

    CSS 方法有很多,但我都讨厌它们。有些多(顺风等),有些少(BEM、OOCSS 等)。但归根结底,它们都有缺陷。 当然,人们使用这些方法有充分的理由,并且解决的许多问题我也遇到过。因此,在这篇文章中,我想写下我自己的关于如何保持 CSS 井井有条的指南。 这并不是一个任何人都可以开始使用的完整描述…

    2025年12月24日
    000
  • css3选择器优化技巧

    CSS3 选择器优化技巧可提升网页性能:减少选择器层级,提高浏览器解析效率。避免通配符选择器,减少性能损耗。优先使用 ID 选择器,快速定位目标元素。用类选择器代替标签选择器,精确匹配。使用属性选择器,增强匹配精度。巧用伪类和伪元素,提升性能。组合多个选择器,简化代码。利用 CSS 预处理器,增强代…

    2025年12月24日
    300
  • action在css中的用法

    CSS 中 action 关键字用于定义鼠标悬停或激活元素时的行为,语法:element:action { style-property: value; }。它可以应用于 :hover 和 :active 伪类,用于创建交互效果,如更改元素外观、显示隐藏元素或启动动画。 action 在 CSS 中…

    2025年12月24日
    000
  • css规则的类型有哪些

    CSS 规则包括:通用规则:选择所有元素类型选择器:根据元素类型选择元素类选择器:根据元素的 class 属性选择元素ID 选择器:根据元素的 id 属性选择元素(唯一)后代选择器:选择特定父元素内的元素子选择器:选择作为特定父元素的直接子元素的元素伪类:基于元素的状态或特性选择元素伪元素:创建元素…

    2025年12月24日
    000
  • css代码规范有哪些

    CSS 代码规范对于保持一致性、可读性和可维护性至关重要,常见的规范包括:命名约定:使用小写字母和短划线,命名特定且描述性。缩进和对齐:按特定规则缩进、对齐选择器、声明和值。属性和值顺序:遵循特定顺序排列属性和值。注释:解释复杂代码,并使用正确的语法。分号:每个声明后添加分号。大括号:左大括号前换行…

    2025年12月24日
    200
  • html5怎么引用js_HTML5用外链或内嵌JS代码引用脚本【引用】

    HTML5中执行JavaScript需通过外链或内嵌方式引入:一、外链用,支持defer/async;二、内嵌将代码写入间,推荐置于body底部;三、type属性默认可省略;四、模块化使用type=”module”支持ES6 import/export。 <img sr…

    好文分享 2025年12月23日
    000
  • html5框架怎么设置_HTML5用iframe或div框架集嵌入子页面设框架【设置】

    HTML5中嵌入子页面的现代方案有四种:一、用iframe标签直接嵌入,支持安全与可访问性属性;二、用CSS Grid/Flexbox布局配合JavaScript动态加载HTML片段;三、用Shadow DOM封装自定义元素实现样式脚本隔离;四、用object标签嵌入HTML并提供fallback内…

    2025年12月23日
    200
  • 带文字描边的HTML5按钮样式写法【方法】

    可通过text-shadow、-webkit-text-stroke、SVG文本或CSS自定义属性实现HTML5按钮文字描边:text-shadow兼容性好但需多向阴影;-webkit-text-stroke简洁可控但仅限WebKit浏览器;SVG提供高精度描边;CSS变量支持动态主题切换。 如果您…

    2025年12月23日
    000
  • html5能否插入xml文档_html5xml嵌入与节点解析展示【攻略】

    需用JavaScript加载解析XML:一、XMLHttpRequest异步获取并解析;二、DOMParser解析内联XML字符串;三、fetch API配合DOMParser处理;四、XMLSerializer序列化调试;五、getElementsByTagNameNS处理命名空间。 如果您希望在…

    2025年12月23日
    200
  • html如何改变成HTML5_HTML升级为HTML5步骤与转换技巧【指南】

    需更新DOCTYPE为,设置lang属性,用语义化元素替代div,升级表单输入类型,以audio/video替代Flash嵌入多媒体。 如果您正在维护一个传统HTML网页,希望将其升级为符合现代标准的HTML5格式,则需要对文档结构、元素语义、语法规范及媒体支持等方面进行系统性调整。以下是将HTML…

    2025年12月23日
    000
  • html5怎样设计瀑布流布局_html5瀑布流实现与图片懒加载【教程】

    HTML5可通过CSS Grid、Masonry.js、多列布局、IntersectionObserver懒加载及容器查询五种方式实现瀑布流布局。CSS Grid无需JS、响应式强;Masonry.js定位精准适合动态内容;多列布局代码简洁;IntersectionObserver实现高性能懒加载;…

    2025年12月23日
    000
  • 京东html5如何布局_解析京东H5页面布局结构与技巧【布局】

    京东H5页面采用模块化、响应式与语义化结合的设计逻辑:一、用Flexbox实现弹性布局;二、依BEM规范组织HTML结构;三、以viewport与rem实现响应式适配;四、用CSS Grid管理复杂网格;五、借data属性驱动动态样式。 如果您正在分析京东HTML5页面的布局结构,会发现其采用模块化…

    2025年12月23日
    200

发表回复

登录后才能评论
关注微信