Design pattern-js的设计模式(一)

news2024/12/25 14:11:05

前言

什么是设计模式?(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。————《菜鸟教程》总而言之,设计模式就是为了解决软件开发中一些遇到问题的目前解决最佳方案,是由软件工程师们一步一步摸索出来的,使来这些问题轻松化,简单化。本文主要讲解js设计模式中的单例模式以及装饰器模式

单例模式

核心:保证一个类,只有一个实例,并提供一个访问它的全局访问点### 实现一个简单的单例模式

下面我们来看一个简单的单例模式

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

let jitao = new Person('计涛', 20)
let yc = new Person('严辰', 21)

console.log(jitao);
console.log(yc); 
let Person = (function () {let instance = nullreturn function (name, age) {this.name = namethis.age = ageif(instance){return instance}return instance = this}
})()
// function Person(name, age) {
// this.name = name;
// this.age = age
// }

let jitao = new Person('计涛', 20)
let yc = new Person('严辰', 21)

console.log(jitao);
console.log(yc);
console.log(jitao===yc); 
  • 以上代码通过自执行函数和闭包将instance封装起来。并且返回了真正的单例构造方法。但如果哪天,我们需要在其中添加更多的元素,但又不想改写Person,我们该怎么办呢?我们可以通过代理来解决

通过代理实现单例模式

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

Person.prototype.sayHello = function () {console.log(this.name)
}

let jitao = new Person('计涛', 20)
let yc = new Person('严辰', 21)

console.log(jitao)
console.log(yc)
console.log(jitao === yc) 

我们先定义一个Person类,然后在它的原型上定义一个sayHello的方法,那么我们知道,这里不是单例模式,那如何在不改变上面代码的情况下建立一个单例模式呢?这里我们就可以建立一个代理类,来实现单例模式。

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

Person.prototype.sayHello = function () {console.log(this.name)
}

let personProxy = (function () {let instance = nullreturn function (name,age) {if (instance) {return instance}return instance = new Person(name, age)}
})()

let jitao = new personProxy('计涛', 20)
let yc = new personProxy('严辰', 21)

console.log(jitao)
console.log(yc)
console.log(jitao === yc)
jitao.sayHello();
yc.sayHello(); 

装饰器模式

装饰器模式(Decorator)也可称之为装饰者模式,在不改变原有对象的基础上,对其进行包装,拓展,使原有对象可以满足更加复杂的需求。### 增强对象

举个简单的例子,我们定义一个学生类,要求学生需要会HTML、CSS、JS,

function Student(){}
Student.prototype.study = function(){console.log('html');console.log('css');console.log('js');
}
var jitao = new Student(); 

但为了找到工作,我们更加要求学生会vue,react,那怎么办呢?我们便对其进行增强

function Student(){}
Student.prototype.study = function(){console.log('html');console.log('css');console.log('js');
}
// 定义一个装饰类,对student类进行增强
function Decorator(someBody){this.someBody = someBodythis.someBody.ability = 'ability--'return this.someBody
}
var jitao = new Student();
jitao = new Decorator(jitao)
console.log(jitao.ability); 

可以看到我们在jitao这个对象身上增强了一个属性ability,而且可以看到,jitao这个属性依旧是Student里面的。

增强方法

上述是增强了一个对象,那么如何增强一个方法呢?

function Student() { }
Student.prototype.study = function () {console.log('html');console.log('css');console.log('js');
}

// 定义一个装饰类,对Student类进行增强
function Decorator(someBody) {this.someBody = someBody// 把之前study方法备份一下this.someBody._study = someBody.study// 把Decorator构造器中生成的对象中的study,覆盖掉之前的study方法this.someBody.study = this.studyreturn this.someBody
}
Decorator.prototype.study = function(){// 调用原本的study方法this._study();console.log('vue');console.log('react');
}
let jitao = new Student();

jitao = new Decorator(jitao)
jitao.study() 
  • 注意:目前ES中Decorator还处于提案阶段,各大浏览器和node,均未公开支持这一特性.如果想要使用,则需要借用babel的一个插件babel-plugin-transform-decorators才可以.

结语

js的设计模式是开发中不可或缺的一部分,我们要加强学习,小编学识尚浅,有不足之处,请纰漏

最后

最近找到一个VUE的文档,它将VUE的各个知识点进行了总结,整理成了《Vue 开发必须知道的36个技巧》。内容比较详实,对各个知识点的讲解也十分到位。



有需要的小伙伴,可以点击下方卡片领取,无偿分享

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

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

相关文章

【youcans 的 OpenCV 例程 300篇】254.OpenCV 绘制图像标记

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程 300篇】254. OpenCV 绘制标记 7.1 绘图函数基本参数 OpenCV提供了绘图功能,可以在图像上绘制直线、矩形、圆、椭圆等各种几何图形。 函数 cv.line()、cv.rectangle()、cv.circle()、cv.polyli…

深度学习:08 训练、测试和验证集的说明

目录 用于深度学习的数据集 训练集 验证集 测试集 总结 用于深度学习的数据集 接下来,我将在这篇里面讨论在训练和测试神经网络期间使用的不同数据集。 出于模型的训练和测试目的,我们应该将数据分解为三个不同的数据集。这些数据集将包含以下内容…

【小f的刷题笔记】(JS)阶乘 - 阶乘后的零 LeetCode172 阶乘函数后K个零 LeetCode793

【阶乘】 一、阶乘后的零: LeetCode172 链接: 172.阶乘后的零 题目: 思路: 0的产生是一定是因为2*5产生的,所以就是找因数 并且,可想而知,找的到因数5,必然找的到因数2与之搭配…

【MySQL】深入理解B+树索引

文章目录1. 前言2. 索引方案3. InnoDB的索引方案4. 索引的分类4.1 聚簇索引4.2 二级索引4.3 联合索引5. InnoDB中的B树索引的注意事项5.1 内节点中目录项记录的唯一主5.2 一个页至少容纳2条记录6. MyISAM中的索引⽅案简单介绍1. 前言 索引,是MySQL快速查询的秘籍。…

ARMv8/ARMv9:深入理解MPIDR_EL1寄存器中的affinity

快速链接: . 👉👉👉 个人博客笔记导读目录(全部) 👈👈👈 付费专栏-付费课程 【购买须知】:【精选】ARMv8/ARMv9架构入门到精通-[目录] 👈👈👈官方文档(ARM ARM文档)的介绍如下所示 翻译一下MPIDR_EL1相关的英文,如下所示: 作用: 在多处理器系统中,为调…

Xshell 连接虚拟机(Ubuntu、CentOS)

对于一些linux的初学者来说,在没有自己的服务器时可以选择使用虚拟机来代替(如ubuntu、centos等)进行相关的学习。下面介绍下如何使用xshell来远程连接虚拟机。 注意:下面我以Ubuntu来举例说明。 1、创建虚拟机 虚拟机的创建网络…

1、数据库安装修改root密码管理自启服务

MySQL的下载和安装 登录MySQL官网下载MySQL.zip包 MySQL :: Download MySQL Community Server 下载完毕可自行选择存储位置,进行解压 解压后配置环境变量 完成配置后在MySQL目录下新建一个my.ini配置文件 文件写入以下内容 [client] # 设置mysql客户端默认字符集…

面向对象2(static修饰变量和方法、Javabean类、测试类和工具类、对main方法的理解、继承、子类继承父类构造方法变量和方法)

1、static修饰变量和方法 JDK8以前,静态区在方法区里面,JDK8开始,静态区挪到了堆内存当中 理解: 因为静态方法没有this,而非静态方法是有一个隐含的参数this的,所以想在静态方法里面调用非静态变量或方法就…

电子招标采购系统源码之传统采购模式面临的挑战

采购类型多 采购制度:采购金额、部门、品类的差异导致管理标准不同。 采购流程:从供应商管理、寻源操作到合同签订、订单执行,业务流程长,审批节点多,传统管理透明度低,联动性差。 供应商管理难 寻源&#…

亚马逊云科技 Build On - Serverless助力企业降本增效

亚马逊云科技 Build On - Serverless开启零售新篇章梅开三度活动体验实验问题总结一点建议咖啡案例实验Serverless学习总结梅开三度 Hi,作为一名Builder,这也是第三次参加由AWS&CSDN共同举办的Build On活动,跟前几期一样,活动举办方也是…

Java集合ArrayList-学习笔记

目录 ArrayList 集合和数组的优势对比: 1.1 ArrayList类概述 1.2 ArrayList类常用方法 1.3 ArrayList存储字符串并遍历 1.4 ArrayList存储学生对象并遍历 1.5 查找用户的索引 1.6 判断用户的是否存在 ArrayList 集合和数组的优势对比: 集合长度可…

Ardupilot EKF3核心算法《状态量速度与位置预测方程》

目录 文章目录 目录摘要1. Ardupilot EKF3核心算法《状态量速度预测方程》2. Ardupilot EKF3核心算法《状态量位置预测方程》3. Ardupilot EKF3核心算法《状态量速度与位置预测方程》摘要 本节主要记录Ardupilot EKF3核心算法《状态量速度与位置预测方程》的过程,欢迎批评指正…

mysql生产数据库被误删

23年的头一天上班安装数据库,因为ssh工具来回切换失误,犯下不可饶恕的错误,居然将生产数据库全部删除,工作十几年头一次干这种蠢事,第一时间反应是一世英名毁于一旦,赶紧跑路。第二反应还是想办法看能否挽回…

aws eks 使用 cloudformation 创建并更新自管节点组

参考资料 更新现有自行管理的节点组 使用eks自管节点组能够最大程度控制节点的各项配置和参数,包括并不限于ami,节点类型等 但是使用自管节点也给用户带来了较大的维护和更新成本。对于节点组的更新操作,我们可以使用cloudformation的方式…

速览Visual Studio 2022 中的新增功能

目录 性能改进 Visual Studio 2022 为 64 位 在文件中更快地查找 Git 工具速度更快 生成新式应用 适用于 C、.NET 和热重载的更佳开发工具 Blazor & 的汇报ASP.NET 的 Razor 编辑器 热重载 创新触手可及 Git 多存储库支持和行暂存支持 IntelliCode 改进 为每个…

魔方(15)二、三、四、五阶棋盘魔方

棋盘魔方 这价格实在可恶,于是我拿现成的魔方自己贴贴纸。 二阶棋盘魔方A 有4个角块是3面黑,4个角块是3面白,而6个面都是棋盘色。 只需要2步就可以转化成: 所以任意状态只要转化成这个状态再加2步就能复原了。 二阶棋盘魔方B&a…

【C++函数对象】STL基础语法学习 | 仿函数谓词内建仿函数

目录 ●仿函数 1.概念 2.使用 ●谓词 1.一元谓词 2.二元谓词 ●内建仿函数 1.算数仿函数 2.关系仿函数 3.逻辑仿函数 ●仿函数 1.概念 重载函数调用操作符的类,其对象常称为函数对象。函数对象使用重载的()时,行为类似函数的调用,所…

技术更高,设计更远:华为全屋智能设计大赛的审美之跃

“人生到处知何以?应似飞鸿踏雪泥。泥上偶然留指爪,鸿飞那复计东西。”很多设计师朋友跟我说,苏轼这首《和子由渑池怀旧》是对设计与审美的最高理解。好的设计,应该仅仅留下一点点痕迹,同时在简约的表象下隐含大量的审…

高通平台开发系列讲解(USB篇)USB调试手段汇总说明 - 视频课

文章目录 一、USB AT数据流说明二、BUS Hound 工具说明三、sysfs相关USB调试节点四、USB usbmon工具使用五、USB usbmon日志解析六、UsbTreeView软件的使用七、视频讲解分享沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 碰见USB AT不通怎么办?所以本篇章汇总了高通…

Vue与React中父子组件生命周期的执行顺序?【生命周期详细知识讲解!!!】

文章目录一、 Vue中父子组件生命周期1-1 加载渲染过程1-2 销毁过程1-3 展示案例二、 React中父子组件生命周期2-1 关于React新旧版生命周期介绍2-2 父子组件生命周期2-2-1 父子组件初始化2-2-2 子组件修改自身state2-2-3 父组件修改props2-2-4 卸载子组件一、 Vue中父子组件生命…