【前端设计模式】之原型模式

原型模式特性

原型模式(Prototype Pattern)是一种创建型设计模式,它通过克隆现有对象来创建新对象,而不是通过实例化类。原型模式的主要特性包括:

  1. 原型对象:原型对象是一个已经存在的对象,它作为其他对象的原型。新对象可以通过克隆原型对象来创建。
  2. 克隆:通过克隆操作可以创建一个与原型对象相似的新对象,包括属性和方法。
  3. 原型链:每个对象都有一个指向其原型的链接,形成了一个原型链。当访问一个属性或方法时,如果当前对象没有,则会沿着原型链向上查找。

以下是一个简单示例,展示了如何使用JavaScript中的原型模式:

// 定义原型对象
const carPrototype = {wheels: 4,drive() {console.log("Driving the car...");},
};
// 创建新车
const car1 = Object.create(carPrototype);
console.log(car1.wheels); // 输出: 4
car1.drive(); // 输出: "Driving the car..."
// 克隆现有车
const car2 = Object.create(carPrototype);
car2.wheels = 3;
console.log(car2.wheels); // 输出: 3
car2.drive(); // 输出: "Driving the car..."

应用示例

前端原型模式在以下场景中常见应用:

1. 对象创建

原型模式可以用于创建对象,特别是当对象的创建过程比较复杂或需要频繁创建相似对象时。

// 定义原型对象
const componentPrototype = {render() {console.log("Rendering component...");},
};
// 创建新组件
const component1 = Object.create(componentPrototype);
component1.render(); // 输出: "Rendering component..."
// 克隆现有组件
const component2 = Object.create(componentPrototype);
component2.render(); // 输出: "Rendering component..."

2. 数据共享

原型模式可以用于共享数据,通过克隆原型对象来创建新对象,并共享原型对象的属性和方法。

// 定义原型对象
const dataPrototype = {data: [],addData(item) {this.data.push(item);},getData() {return this.data;},
};
// 创建新数据对象
const data1 = Object.create(dataPrototype);
data1.addData("Item 1");
console.log(data1.getData()); // 输出: ["Item 1"]
// 克隆现有数据对象
const data2 = Object.create(dataPrototype);
data2.addData("Item 2");
console.log(data2.getData()); // 输出: ["Item 1", "Item 2"]

在上述示例中,我们定义了一个原型对象dataPrototype,它包含一个data数组和相应的操作方法。通过创建新的数据对象或克隆现有数据对象,我们可以共享和操作相同的数据。

3. 缓存管理

原型模式可以用于缓存管理,通过克隆缓存中的原型对象来创建新对象,提高性能和效率。

// 定义原型对象
const cachePrototype = {cache: {},getData(key) {if (this.cache[key]) {return this.cache[key];} else {const data = fetchDataFromServer(key); // 模拟从服务器获取数据的操作this.cache[key] = data;return data;}},
};
// 创建新缓存对象
const cache1 = Object.create(cachePrototype);
console.log(cache1.getData("key1")); // 模拟从服务器获取数据,并缓存起来
console.log(cache1.getData("key1")); // 直接从缓存中获取数据
// 克隆现有缓存对象
const cache2 = Object.create(cachePrototype);
console.log(cache2.getData("key2")); // 模拟从服务器获取数据,并缓存起来
console.log(cache2.getData("key2")); // 直接从缓存中获取数据

在上述示例中,我们定义了一个原型对象cachePrototype,它包含一个cache对象和一个用于获取数据的方法。通过创建新的缓存对象或克隆现有缓存对象,我们可以共享和管理相同的缓存数据。

这些示例展示了在前端应用中使用原型模式进行数据共享和缓存管理的代码实现。通过使用原型模式,我们可以避免重复创建相似的对象,并提高代码的可维护性和性能。

优缺点

优点
  1. 减少重复代码:通过克隆现有对象来创建新对象,避免了重复编写相似的代码。
  2. 提高性能:与实例化类相比,克隆操作更加高效。
  3. 灵活性:可以动态地添加或修改原型对象的属性和方法。
缺点
  1. 对象状态共享:由于多个实例共享同一个原型对象,对其中一个实例进行修改可能会影响其他实例。
  2. 对象构建复杂性:如果原型对象的构建过程比较复杂,可能会导致克隆操作变得复杂。

总结

原型模式是一种常用的设计模式,它通过克隆现有对象来创建新对象,减少了重复代码并提高了性能。在前端开发中,原型模式常用于对象创建、数据共享和缓存管理等场景。然而,需要注意对共享状态的管理和克隆操作的复杂性。

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

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

相关文章

DDD架构思想专栏二《领域层的决策设计思想详解》

如果不了解DDD基本概念的读者可以去看这篇文章,传送门:DDD架构思想专栏一《初识领域驱动设计DDD落地》-CSDN博客 前言介绍 在上一章节介绍了领域驱动设计的基本概念以及按照领域驱动设计的思想进行代码分层,但是仅仅只是从一个简单的分层结…

使用函数验证哥德巴赫猜想

本题要求实现一个判断素数的简单函数,并利用该函数验证哥德巴赫猜想:任何一个不小于6的偶数均可表示为两个奇素数之和。素数就是只能被1和自身整除的正整数。注意:1不是素数,2是素数。 函数接口定义: int prime( int…

【Flink系列三】数据流图和任务链计算方式

上文介绍了如何计算并行度和slot的数量,本文介绍Flink代码提交后,如何生成计算的DAG数据流图。 程序和数据流图 所有的Flink程序都是由三部分组成的:Source、Transformation和Sink。Source负责读取数据源,Transformation利用各种…

Remix IDE 快速开始Starknet

文章目录 一、Remix 项目二、基于Web的开发环境Remix 在线 IDE三、Starknet Remix 插件如何使用使用 Remix【重要】通过 Starknet by Example 学习一、Remix 项目 Remix 项目网站 在以太坊合约开发领域,Remix 项目享有很高的声誉,为各个级别的开发人员提供功能丰富的工具集…

JS中深拷贝与浅拷贝

定义 深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是在编程中常用的两种对象复制方式。 浅拷贝(Shallow Copy): 浅拷贝是创建一个新的对象,将原始对象的属性值复制到新对象中。如果属…

Smart Link和Monitor Link

Smart Link和Monitor Link简介 Smart Link,又叫做备份链路。一个Smart Link由两个接口组成,其中一个接口作为另一个的备份。Smart Link常用于双上行组网,提供可靠高效的备份和快速的切换机制。 Monitor Link是一种接口联动方案,它…

[linux] git lfs install 安装lfs

如果报错,需要安装 apt-get sudo apt-get update sudo apt-get install git-lfs --fix-missing [linux] huggingface transformers 如何下载模型至本地 & git lfs install 报错_心心喵的博客-CSDN博客

nodejs流

什么是流 stream 流是用于在 Node.js 中处理流数据的抽象接口。 node:stream 模块提供了用于实现流接口的 API。 什么是流数据 流数据是指一组顺序、大量、快速、连续到达的数据序列,一般情况下数据流可被视为一个随时间延续而无限增长的动态数据集合。流数据应用…

【keil备忘录】2. stm32 keil仿真时的时间测量功能

配置仿真器Trace内核时钟为单片机实际的内核时钟,需要勾选Enable设置,设置完成后Enable取消勾选也可以,经测试时钟频率配置仍然生效,此处设置为48MHZ: 时间测量时必须打开register窗口,否则可能不会计数 右下角有计…

第十四章 : Spring Boot 整合spring-session,使用redis共享

第十四章 : Spring Boot 整合spring-session,使用redis共享 前沿 本文重点讲述:spring boot工程中使用spring-session机制进行安全认证,并且通过redis存储session,满足集群部署、分布式系统的session共享。 基于SPringBoot 2.3.2…

全面指南:常见邮箱客户端连接配置

本文 首发于 Anyeの小站 本教程不局限于 Halo 邮箱配置,同时也适配所有使用邮箱的站点或者邮件客户端配置。 在接下来的内容中,我们将介绍如何配置其他常见的邮箱服务,如 QQ、Gmail、Outlook 等,其他邮箱可以以此类推。无论您使用…

[linux运维] 利用zabbix监控linux高危命令并发送告警(基于Zabbix 6)

之前写过一篇是基于zabbix 5.4的实现文章,但是不太详细,最近已经有两个小伙伴在zabbix 6上操作,发现触发器没有str函数,所以更新一下本文,基于zabbix 6 0x01 来看看效果 高危指令出发问题告警: 发出邮件告…

学好操作系统需要的前置知识

1. 态度:不要等一切都准备好了再前行 如果把一切你可能会说,没有这些基础知识,我每看一篇文章,知识就铺天盖地席卷过来,仿佛每一个知识点都准确地打在了自己的盲点上,这该怎么办呢? 我非常能理…

AI助力智慧农业,基于YOLOv8全系列模型【n/s/m/l/x】开发构建不同参数量级的识别系统

智慧农业随着数字化信息化浪潮的演变有了新的定义,在前面的系列博文中,我们从一些现实世界里面的所见所想所感进行了很多对应的实践,感兴趣的话可以自行移步阅读即可: 《自建数据集,基于YOLOv7开发构建农田场景下杂草…

学习redis(待完善)

键值对数据库 特征 *键值型 *单线程(多线程情况 仅仅在于网络请求) *低延迟,速度快(基于内存,IO多路复用,) *支持持久化 *支持集群,分片 *支持多语言 常见的命令 数据结构&#xff1…

05 JQuery基础入门

文章目录 一、jQuery介绍1. 简介2. 版本介绍3. 相关网站4. HTML引入方式 二、基础语法1. 顶级对象$2. 与DOM对象转化3. 选择器4. 事件5. 动画6. 修改样式7. 修改属性 一、jQuery介绍 1. 简介 jQuery是JavaScript编程语言底层库,它是一个快速,简洁的Jav…

ERPNext SQL 注入漏洞复现

0x01 产品简介 ERPNext 是一套开源的企业资源计划系统。 0x02 漏洞概述 ERPNext 系统frappe.model.db_query.get_list 文件 filters 参数存在 SQL 注入漏洞,攻击者除了可以利用 SQL 注入漏洞获取数据库中的信息(例如,管理员后台密码、站点的用户个人信息)之外,甚至在高权…

基于springboot实现的仿天猫商城项目

一、系统架构 前端:jsp | js | css | jquery 后端:springboot | mybatis-plus 环境:jdk1.7 | mysql | maven 二、代码及数据库 三、功能介绍 01. web端-首页 02. web端-商品查询 03. web端-商品详情 04. web端-购物车 05. web端-订单…

集合的几个遍历方法

1. 集合的遍历 1.0 创建集合代码 List<String> strList new ArrayList<>(); strList.add("huawei"); strList.add("xiaomi"); strList.add("tencent"); strList.add("google"); strList.add("baidu");1.1 fo…

复杂gRPC之go调用go

1. 复杂的gRPC调用 我们使用了一个较为复杂的proto文件&#xff0c;这个文件的功能主要是用来定位的&#xff0c;详细内容可以看代码中的注解 syntax "proto3"; //指定生成的所属的package&#xff0c;方便调用 option go_package "./"; package route…