【前端设计模式】之原型模式
原型模式特性
原型模式(Prototype Pattern)是一种创建型设计模式,它通过克隆现有对象来创建新对象,而不是通过实例化类。原型模式的主要特性包括:
- 原型对象:原型对象是一个已经存在的对象,它作为其他对象的原型。新对象可以通过克隆原型对象来创建。
- 克隆:通过克隆操作可以创建一个与原型对象相似的新对象,包括属性和方法。
- 原型链:每个对象都有一个指向其原型的链接,形成了一个原型链。当访问一个属性或方法时,如果当前对象没有,则会沿着原型链向上查找。
以下是一个简单示例,展示了如何使用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
对象和一个用于获取数据的方法。通过创建新的缓存对象或克隆现有缓存对象,我们可以共享和管理相同的缓存数据。
这些示例展示了在前端应用中使用原型模式进行数据共享和缓存管理的代码实现。通过使用原型模式,我们可以避免重复创建相似的对象,并提高代码的可维护性和性能。
优缺点
优点
- 减少重复代码:通过克隆现有对象来创建新对象,避免了重复编写相似的代码。
- 提高性能:与实例化类相比,克隆操作更加高效。
- 灵活性:可以动态地添加或修改原型对象的属性和方法。
缺点
- 对象状态共享:由于多个实例共享同一个原型对象,对其中一个实例进行修改可能会影响其他实例。
- 对象构建复杂性:如果原型对象的构建过程比较复杂,可能会导致克隆操作变得复杂。
总结
原型模式是一种常用的设计模式,它通过克隆现有对象来创建新对象,减少了重复代码并提高了性能。在前端开发中,原型模式常用于对象创建、数据共享和缓存管理等场景。然而,需要注意对共享状态的管理和克隆操作的复杂性。
相关文章:
【前端设计模式】之原型模式
原型模式特性 原型模式(Prototype Pattern)是一种创建型设计模式,它通过克隆现有对象来创建新对象,而不是通过实例化类。原型模式的主要特性包括: 原型对象:原型对象是一个已经存在的对象,它作…...
软件设计原则
设计原则 一、单一原则 1. 如何理解单一职责原则 单一职责原则(Single Responsibility Principle,简称SRP),它要求一个类或模块应该只负责一个特定的功能。实现代码的高内聚和低耦合,提高代码的可读性和可维护性。 …...
【面试HOT100】哈希双指针滑动窗口
系列综述: 💞目的:本系列是个人整理为了秋招面试的,整理期间苛求每个知识点,平衡理解简易度与深入程度。 🥰来源:材料主要源于LeetCodeHot100进行的,每个知识点的修正和深入主要参考…...
Ubuntu20.04 配置 yolov5_ros 功能包记录
文章目录 本文参考自博主源801,结合自己踩坑后修改 项目地址:https://github.com/mats-robotics/yolov5_ros 1.新建工作空间 新建一个工作空间 yolo_ros(名字可自定义),在 yolo_ros 下新建文件夹 src 并catkin_make进行编译 2. 安装相机驱动,可以选用较为主流的 usb_cam 或…...
Flink的处理函数——processFunction
目录 一、处理函数概述 二、Process函数分类——8个 (1)ProcessFunction (2)KeyedProcessFunction (3)ProcessWindowFunction (4)ProcessAllWindowFunction ÿ…...
Linux系统中的ps命令详解及用法介绍
文章目录 一、介绍ps命令A. ps命令的作用B. ps命令的参数 二、常见的ps命令用法A. 显示所有进程信息B. 显示指定进程信息C. 显示指定用户的进程信息D. 按CPU使用率排序显示进程信息E. 按内存使用率排序显示进程信息 三、进一步了解ps命令A. 显示进程树信息B. 显示线程和进程关系…...
机器学习笔记 - 基于pytorch、grad-cam的计算机视觉的高级可解释人工智能
一、pytorch-gradcam简介 Grad-CAM是常见的神经网络可视化的工具,用于探索模型的可解释性,广泛出现在各大顶会论文中,以详细具体地描述模型的效果。Grad-CAM的好处是,可以在不额外训练的情况下,只使用训练好的权重即可获得热力图。 1、CAM是什么? CAM全称Class Activa…...
Python 编程基础 | 第五章-类与对象 | 5.1、定义类
一、类 1、定义类 Python中使用class关键字定义类,class之后为类的名称并以:结尾,类的结构如下: class 类名:多个(≥0)类属性...多个(≥0)类方法...下面定义一个Dog类,如…...
合宙Air780e+luatos+腾讯云物联网平台完成设备通信与控制(属性上报+4G远程点灯)
1.腾讯云物联网平台 首先需要在腾讯云物联网平台创建产品、创建设备、定义设备属性和行为,例如: (1)创建产品 (2)定义设备属性和行为 (3)创建设备 (4)准备参…...
c++系列之string的模拟实现
💗 💗 博客:小怡同学 💗 💗 个人简介:编程小萌新 💗 💗 如果博客对大家有用的话,请点赞关注再收藏 🌞 string() //注意事项: 1.初始化列表随声明的顺序进行初始化 2.cons…...
Spring的beanName生成器AnnotationBeanNameGenerator
博主介绍:✌全网粉丝4W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验…...
FFmpeg 命令:从入门到精通 | ffmpeg 命令直播
FFmpeg 命令:从入门到精通 | ffmpeg 命令直播 FFmpeg 命令:从入门到精通 | ffmpeg 命令直播直播拉流直播推流 FFmpeg 命令:从入门到精通 | ffmpeg 命令直播 本节主要介绍了ffmpeg 命令进行直播拉流、推流的方法,并列举了一些例子…...
A (1087) : DS单链表--类实现
Description 用C语言和类实现单链表,含头结点 属性包括:data数据域、next指针域 操作包括:插入、删除、查找 注意:单链表不是数组,所以位置从1开始对应首结点,头结点不放数据 类定义参考 #include<…...
异常:找不到匹配的key exchange算法
目录 问题描述原因分析解决方案 问题描述 PC 操作系统:Windows 10 企业版 LTSC PC 异常软件:XshellPortable 4(Build 0127) PC 正常软件:PuTTY Release 0.74、MobaXterm_Personal_23.1 服务器操作系统:OpenEuler 22.03 (LTS-SP2)…...
Arcgis打开影像分析窗口没反应
Arcgis打开影像分析窗口没反应 问题描述 做NDVI计算的时候,一直点击窗口-影像分析,发现影像分析的小界面一直不跳出来。 原因 后来发现是被内容列表给遮住了,其实是已经出来了的。。 拖动内容列表就能找到。 解决方案 内容列表和影像分…...
Spring(JavaEE进阶系列1)
目录 前言: 1.Servlet与Spring对比 2.什么是Spring 2.1什么是容器 2.2什么是IoC 2.3SpringIoC容器的理解 2.4DI依赖注入 2.5IoC与DI的区别 3.Spring项目的创建和使用 3.1正确配置Maven国内源 3.2Spring的项目创建 3.3将Bean对象存储到Spring(…...
Flink状态管理与检查点机制
1.状态分类 相对于其他流计算框架,Flink 一个比较重要的特性就是其支持有状态计算。即你可以将中间的计算结果进行保存,并提供给后续的计算使用: 具体而言,Flink 又将状态 (State) 分为 Keyed State 与 Operator State: 1.1 算子状态 算子状态 (Operator State):顾名思义…...
【threejs】基本编程概念及海岛模型展示逻辑
采用three封装模式完成的海岛动画(点击这里查看) 直接上代码吧 <template><div class"scene"><video id"videoContainer" style"position:absolute;top:0px;left:0px;z-index:100;visibility: hidden"&g…...
python小技巧:创建单链表及删除元素
目前只有单链表(无法查找上一个元素),后面再更新循环链表和双链表。 class SingleLinkedList:def createList(self, raw_list):if len(raw_list) 0:head ListNode()else:head ListNode(raw_list[0])cur headfor i in range(1, len(raw_l…...
ADuM1250 ADuM1251 模块 I2C IIC总线2500V电磁隔离 接口保护
功能说明: 1,2500V电磁隔离,2通道双向I2C; 2,支持电压在3到5.5V,最大时钟频率可达1000KHz; 3,将该隔离模块接入总线,可以保护主MCU引脚,降低I2C总线上的干…...
C# 把多个dll合成一个dll
Nuget 下载ILMerge两个工程 dog为测试工程 TestIlmerge为准备合并的类库 如下图所示, 由于我们引用下面4个库 正常生成后,会有TestIlmerge.dll和下面的这4个dll 只生成TestIlmerge.dll 打开工程文件 在最下方加入以下两段 <Target Name"ILMerge…...
scipy.sparse.coo_matrix.sum()关于axis的用法
以下面的矩阵为例 [1,2,0] [0,3,0] [0,0,0]示例代码 from scipy.sparse import coo_matrix# 创建一个稀疏矩阵 data [1, 2, 3] row [0, 0, 1] col [0, 1, 1] sparse_matrix coo_matrix((data, (row, col)), shape(3,3))# 计算稀疏矩阵中每行非零元素的总和 sum_of_column…...
C++类与对象(下)
文章目录 1.非类型模板2.模板特化2.1.类模板特化2.1.1.全特化2.1.2.偏特化 2.2.函数模板特化 3.函数模板声明定义分离 之前我们学习的模板能达到泛型的原因是:使用了“泛型的类型”,但是如果经过后面的“造轮子”(后面会尝试实现一下 STL的一…...
SpringBoot——》引入Redis
推荐链接: 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…...
C# newtonsoft序列化将long类型转化为字符串
/// <summary> /// 转化为json的时候long类型转为string /// </summary> public class LongJsonConverter: JsonConverter {public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer){try{return r…...
黑马点评-02使用Redis代替session,Redis + token机制实现
Redis代替session session共享问题 每个Tomcat中都有一份属于自己的session,所以多台Tomcat并不共享session存储空间,当请求切换到不同tomcat服务时可能会导致数据丢失 用户第一次访问1号tomcat并把自己的信息存放session域中, 如果第二次访问到了2号tomcat就无法获取到在1号…...
arm 点灯实验代码以及现象
.text .global _start _start: 1.设置GPIOE寄存器的时钟使能 RCC_MP_AHB4ENSETR[4]->1 0x50000a28 LDR R0,0x50000A28 LDR R1,[R0] ORR R1,R1,#(0x1<<4) 第4位置1 STR R1,[R0] 1.设置GPIOF寄存器的时钟使能 RCC_MP_AHB4ENSETR[4]->1 0x50000a28 LDR R…...
选择适合普通公司的项目管理软件
不管是打工人还是学生党都适合使用Zoho Projects项目管理软件。利用项目概览功能,将整体项目尽收眼底,作为项目管理者,项目日程、进度都可见,Zoho Projects项目管理APP助推项目每一环节的进展,更便于管理者设计项目的下…...
E (1081) : DS堆栈--逆序输出(STL栈使用)
Description C中已经自带堆栈对象stack,无需编写堆栈操作的具体实现代码。 本题目主要帮助大家熟悉stack对象的使用,然后实现字符串的逆序输出 输入一个字符串,按字符按输入顺序压入堆栈,然后根据堆栈后进先出的特点࿰…...
访问者模式 行为型设计模式之九
1.定义 在不改变数据结构的前提下,增加作用于一组对象元素的新功能。 2.动机 访问者模式适用于数据结构相对稳定的系统它把数据结构和作用于数据结构之上的操作之间的耦合解脱开,使得操作集合可以相对自由的演化。访问者模式的目的是要把处理从数据结构…...
17网站一起做网店靠谱吗/网站优化价格
ps:查看当前进程(ps -aef)例子:查看当前进程用户ID 进程ID 父进程ID CPU占用率 开始时间 终端ID 运行总时间 命令名pidof:查看某项服务的所有进程Kill:中止进程例子:中止进程ID为3393的进程killall:…...
怎么样提高网站点击率/十大成功营销策划案例
这个要看具体的执行计划。首先我们要分析清楚select *和select a1,a2,a3的区别。首先sql server是按照数据块来存取数据的,一个数据块是8K,当你需要的数据在某个数据块上时,sql server会将整个8K的数据从磁盘上加载到内存中,而不仅…...
wordpress子菜单/seo搜索引擎优化实战
使用场景: 在服务器cpu 被占用过多的情况下,查看win 的资源管理器查看,哪些服务占用资源过多。 操作方法: WIN R ,输入perfmon -res,即可。 Linux 资源管理器可以使用top。...
网站开发需求/什么是seo标题优化
[彻底解决 configparser 中文乱码问题,让你的 Python3 代码更加优雅] Python3 configparser 是一个非常重要的模块,它可以帮助我们读取和写入配置文件,很多项目都会用到这个模块。但是在使用过程中,我们可能会遇到中文乱码的问题,这给我们的编码工作带来了很大的困扰。 …...
淘宝上那些做网站seo的管用吗/武汉it培训机构排名前十
1.在MySQL中创建数据库 """创建mysql数据库""" import pymysql # 数据库连接引用类 from pymysql.connections import Connection # 游标操作类 from pymysql.cursors import Cursor# 通过pymysql的方法connect()方法声明一个MySQL连接对象conn。…...
网站建设公司哪个好/百度一下你知道主页官网
文章与教程 Planning Android Screens (slides.com) Dmytro Danylyk的演讲幻灯片,关于程序员和设计师如何一起设计一款新的app。 我在Droidcon London上做的事情(medium.com) Joe Birch概括了他在Droidcon London上的经历。 掌握Coordinator Layout (saulmm.gith…...