【阅读笔记】JavaScript设计模式与开发实践2--闭包与单例、策略模式
目录
- 闭包与高阶函数
- Function 扩展函数
- 柯里化函数
- 单例模式
- 透明的单例模式
- 惰性单例
- 策略模式
- 策略模式发展
- 策略模式实现
闭包与高阶函数
Array.prototype.sort 接受一个函数当作参数,用户可以自行在该函数内指定排序方式
// 由小到大排序
let res = [1, 4, 2].sort((a, b) => {return a - b;
});
console.log(res);
Function 扩展函数
通过对 Function 原型执行扩展,可以达到类似装饰器的效果,这也是 AOP 风格的体现
Function.prototype.before = function (beforefn) {var __self = this; // 保存原函数的引用return function () {// 返回包含了原函数和新函数的"代理"函数beforefn.apply(this, arguments); // 执行新函数,修正thisreturn __self.apply(this, arguments); // 执行原函数};
};Function.prototype.after = function (afterfn) {var __self = this;return function () {var ret = __self.apply(this, arguments);afterfn.apply(this, arguments);return ret;};
};var func = function () {console.log(2);
};func = func.before(function () {console.log(1);}).after(function () {console.log(3);});func(); // 1,2,3
柯里化函数
currying 又称部分求值。一个 currying 的函数首先会接受一些参数,接受了这些参数之后,该函数并不会立即求值,而是继续返回另外一个函数,刚才传入的参数在函数形成的闭包中被保存起来。待到函数被真正需要求值的时候,之前传入的所有参数都会被一次性用于求值
var currying = function (fn) {var args = [];// 当调用柯里函数时不带任何参数,直接执行所有栈中函数// 当调用柯里函数时带入了参数,就会向args压入一个新的带参函数return function () {if (arguments.length === 0) {return fn.apply(this, args);} else {[].push.apply(args, arguments);return arguments.callee;}};
};// 将cost写成一个IIFE函数,之后其将转变为柯里函数
var cost = (function () {var money = 0;return function () {for (var i = 0, l = arguments.length; i < l; i++) {money += arguments[i];}return money;};
})();var cost = currying(cost); // 转化成currying函数cost(100); // 未真正求值
cost(200); // 未真正求值
cost(300); // 未真正求值
alert(cost()); // 求值并输出:600
单例模式
透明的单例模式
传统单例模式,需要你知道当前对象是单例的,且可以调用 getInstance 方法获取其实例
可以使用代理的方式管理单例,而对象本身不处理代理相关逻辑
var CreateDiv = function (html) {this.html = html;this.init();
};CreateDiv.prototype.init = function () {var div = document.createElement("div");div.innerHTML = this.html;document.body.appendChild(div);
};// 使用代理创建以及识别单例
var ProxySingletonCreateDiv = (function () {var instance;return function (html) {if (!instance) {instance = new CreateDiv(html);}return instance;};
})();var a = new ProxySingletonCreateDiv("sven1");
var b = new ProxySingletonCreateDiv("sven2");alert(a === b); // true
惰性单例
将获取单例的方法单独抽离出来,通过此方法获取对象的单例
var getSingle = function (fn) {var result;return function () {return result || (result = fn.apply(this, arguments));};
};
策略模式
策略模式的目的就是将算法的使用与算法的实现分离开来
策略模式发展
假设有这么一个场景:需要通过员工名字及其薪水计算奖金
经典方法需要每次接收对应的两个参数,方法内需要大量的 ifelse 做逻辑覆盖,并且缺乏弹性违背开闭原则;
策略模式实现
var strategies = {S: function (salary) {return salary * 4;},A: function (salary) {return salary * 3;},B: function (salary) {return salary * 2;},
};var calculateBonus = function (level, salary) {return strategies[level](salary);
};console.log(calculateBonus("S", 20000)); // 输出:80000
console.log(calculateBonus("A", 10000)); // 输出:30000
相关文章:
【阅读笔记】JavaScript设计模式与开发实践2--闭包与单例、策略模式
目录闭包与高阶函数Function 扩展函数柯里化函数单例模式透明的单例模式惰性单例策略模式策略模式发展策略模式实现闭包与高阶函数 Array.prototype.sort 接受一个函数当作参数,用户可以自行在该函数内指定排序方式 // 由小到大排序 let res [1, 4, 2].sort((a, …...
设计模式(二十)----行为型模式之责任链模式
1、概述 在现实生活中,常常会出现这样的事例:一个请求有多个对象可以处理,但每个对象的处理条件或权限不同。例如,公司员工请假,可批假的领导有部门负责人、副总经理、总经理等,但每个领导能批准的天数不同…...
数据持久化层--冷热分离
业务场景 有一个系统的主要功能是这样的:它会对接客户的邮件服务器,自动收取发到几个特定客服邮箱的邮件,每收到一封客服邮件,就自动生成一个工单。之后系统就会根据一些规则将工单分派给不同的客服专员处理。 这家媒体集团客户两年多产生了近2000万的工单,工单的操作记…...
Ubuntu16.04系统 VSCode中python开发插件的安装
VSCode中python开发插件的安装 1. python python插件提供了代码分析,高亮,规范化等很多基本功能 2. Python for vscode 3. Python Preview 实时可视化你的代码结果。如果你Leedcode等题时,可以安装这个插件。能为VSCode切换各种主题皮肤…...
buuctf-pwn write-ups (12)
文章目录buu093-wustctf2020_easyfastbuu094-ciscn_2019_es_1buu095-wdb2018_guessbuu096-gyctf_2020_some_thing_excetingbuu097-axb_2019_heapbuu098-oneshot_tjctf_2016buu099-护网杯_2018_gettingstartbuu100-wustctf2020_number_gamebuu101-zctf2016_note2buu093-wustctf2…...
Linux- 系统随你玩之--网络上的黑客帝国
文章目录1、前言2、TCPDump介绍2.1、问题来了: 所有用户都可以采用该命令吗?2.2、抓包原理2.3、特点2.3.1、参数化支持2.2.2、 TCP功能3、 服务器安装Tcpdump3.1、安装3.2、检查安装是否正常。4、tcpdump 命令4.1、常用功能选项4.2、输出内容5、实操5.1、…...
Python每日一练(20230312)
目录 1. 提示用户输入的简单菜单 ★ 2. 字母异位词分组 ★★ 3. 俄罗斯套娃信封问题 ★★★ 🌟 每日一练刷题专栏 C/C 每日一练 专栏 Python 每日一练 专栏 1. 提示用户输入的简单菜单 如果用户选择菜单选项1,提示用户输入1到10之间的整数&a…...
人生又有几个四年
机缘 不知不觉,已经来 csdn 创作四周年啦~ 我是在刚工作不到一年的时候接触 csdn 的,当时在学习 node,对 node 的文件相关的几个 api 总是搞混,本来还想着在传统的纸质笔记本上记一下,但是想想我大学记了好久的笔记本…...
第九章:Java集合
第九章:Java集合 9.1:Java集合框架概述 数组、集合都是对多个数据进行存储(内存层面,不涉及持久化)操作的结构,简称Java容器。 数组存储多个数据方面的特点 一旦初始化以后,其长度就确定了。数组一旦定义好ÿ…...
嵌入式学习笔记——STM32的USART通信概述
文章目录前言常用通信协议分类及其特征介绍通信协议通信协议分类1.同步异步通信2.全双工/半双工/单工3.现场总线/板级总线4. 串行/并行通信5. 有线通信、无线通信STM32通信协议的配置方式使用通信协议控制器实现使用IO口模拟的方式实现STM32串口通信概述什么是串口通信STM32F40…...
MySQL性能优化
MySQL性能调优 存储数据类型优化 尽量避免使用 NULL尽量使用可以的最小数据类型。但也要确保没有低估需要存储的范围整型比字符串操作代价更低使用 MySQL 内建的数据类型(比如date、time、datetime),比用字符串更快 基本数据类型 数字 整数…...
C语言/动态通讯录
本文使用了malloc、realloc、calloc等和内存开辟有关的函数。 文章目录 前言 二、头文件 三、主界面 四、通讯录功能函数 1.全代码 2.增加联系人 3.删除联系人 4.查找联系人 5.修改联系人 6.展示联系人 7.清空联系人 8.退出通讯录 总结 前言 为了使用通讯录时,可以…...
我用Compose做了一个地图轮子OmniMap
一、前言 半年前,我发布过一篇介绍:Compose里面如何使用地图,比如高德地图 的文章,原本是没有想造什么轮子的✍️ 闲来无事,有一天看到了评论区留言让我把源码地址分享出来,我感觉我太懒了,后来…...
STM32之SPI
SPISPI介绍SPI是串行外设接口(Serial Peripherallnterface)的缩写,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便…...
02 深度学习环境搭建
1、查看对应版本关系 详细见:https://blog.csdn.net/qq_41946216/article/details/129476095?spm1001.2014.3001.5501此案例环境使用 CUDA 11.7、Pytouch1.12.1、Miniconda3_py38(含Python3.8) 2. 安装Anaconda 或 Miniconda 本案例重点一为Miniconda准 2.1 安…...
PHP导入大量CSV数据的方法分享
/** * @description 迭代器读取csv文件 * @param $strCsvPath * @return \Generator */ public static function readPathCsvFile($strCsvPath) { if ($handle = fopen($strCsvPath, r)) { while (!feof($handle)) { yield fgetcsv($handle); } …...
代码看不懂?ChatGPT 帮你解释,详细到爆!
偷个懒,用ChatGPT 帮我写段生物信息代码如果 ChatGPT 给出的的代码不太完善,如何请他一步步改好?网上看到一段代码,不知道是什么含义?输入 ChatGPT 帮我们解释下。生信宝典 1: 下面是一段 Linux 代码,请帮…...
【MyBatis】篇三.自定义映射resultMap和动态SQL
MyBatis整理 篇一.MyBatis环境搭建与增删改查 篇二.MyBatis查询与特殊SQL 篇三.自定义映射resultMap和动态SQL 篇四.MyBatis缓存和逆向工程 文章目录1、自定义映射P1:测试数据准备P2:字段和属性的映射关系P3:多对一的映射关系P4:一对多的映射关系2、动态SQL2.1 IF标签2.2 w…...
什么是API?(详细解说)
编程资料时经常会看到API这个名词,网上各种高大上的解释估计放倒了一批初学者。初学者看到下面这一段话可能就有点头痛了。 API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开…...
比cat更好用的命令!
大家好,我是良许。 作为程序员,大家一定对 cat 这个命令不陌生。它主要的功能就是用来显示文本文件的具体内容。 但 cat 命令两个很重大的缺陷:1. 不能语法高亮输出;2. 文本太长的话无法翻页输出。正是这两个不足,使…...
YOLOv5 vs YOLOv8:2024年工业部署选型指南(附实测对比)
YOLOv5 vs YOLOv8:2024年工业部署选型指南(附实测对比) 在工业视觉检测领域,目标检测模型的选型直接关系到产线良率、运维成本和系统响应速度。作为YOLO系列当前最成熟的工业级解决方案,YOLOv5和YOLOv8的抉择让不少工程…...
一、硬件接线与配置
自动配料控制系统 S7-200SMART 与组态王6.55联机程序 COM3串口通讯 带运行效果视频 IO表 和 PLC接线图CAD 老规矩先看IO表——配料系统核心是4路称重传感器2台变频器控制下料速度。PLC的EM AE04模块接0-10V称重信号,EM DR32数字量模块控制接触器和报警灯。CAD接线图…...
嵌入式无锁环形缓冲区:SPSC零依赖实现
1. 项目概述nl_ring_buffer是一个极简、零依赖、可移植的环形缓冲区(Circular Buffer)实现,专为嵌入式系统底层开发设计。其核心目标并非提供功能堆砌,而是以最小代码体积、确定性执行时间、无动态内存分配、无锁(lock…...
SurfaceFlinger渲染管线的三种负载状态
//frameworks/native/services/surfaceflinger/Scheduler/VsyncModulator.h enum class VsyncConfigType {Early, EarlyGpu, Late };SurfaceFlinger 内部有一个叫做 VSyncModulator(VSYNC 调制器)的组件,它就像一个自动挡变速箱。它会实时监控当前屏幕上发生的事情,并在 Ea…...
快速体验语义搜索:用Qwen3-Embedding-4B搭建个人知识库
快速体验语义搜索:用Qwen3-Embedding-4B搭建个人知识库 1. 认识Qwen3-Embedding-4B:你的智能语义理解助手 想象一下,你有一个能理解各种语言、能记住海量文档内容、还能帮你快速找到相关信息的智能助手。这就是Qwen3-Embedding-4B能为你做的…...
ai辅助开发:基于快马平台为trea国际版添加汇率数据智能分析功能
最近在开发Trea国际版应用时,遇到了一个需求:如何让用户更直观地理解汇率波动趋势,并通过自然语言交互获得分析结果。这个功能看似复杂,但借助InsCode(快马)平台的AI辅助开发能力,整个过程变得异常简单。下面分享我的实…...
STM32L0待机模式唤醒后程序跑飞?用LL库/HAL库正确处理系统复位与初始化
STM32L0待机模式唤醒后的系统复位陷阱与实战解决方案 引言:被忽视的唤醒后世界 当你按下STM32L0的唤醒按键,看到电流表指针从微安级跳回毫安级,内心是否涌起一阵成就感?但紧接着,OLED屏幕不再刷新,蓝牙模块…...
YOLOv12惊艳效果展示:注意力机制让目标检测更精准
YOLOv12惊艳效果展示:注意力机制让目标检测更精准 1. 突破性效果预览 YOLOv12的出现彻底改变了我们对实时目标检测的认知。这款基于注意力机制的全新架构,在保持YOLO系列标志性速度的同时,将检测精度推向了前所未有的高度。让我们先看几个令…...
百度网盘提取码智能获取:3分钟解锁加密资源的秘密武器
百度网盘提取码智能获取:3分钟解锁加密资源的秘密武器 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 还在为百度网盘上那些需要提取码的资源而烦恼吗?每次遇到心仪的学习资料、软件工具或影视资源&…...
Cesium 视角控制全攻略:禁用鼠标交互的多种方法
1. 为什么需要禁用Cesium鼠标交互? 在开发基于Cesium的三维地理信息系统时,我们经常会遇到需要限制用户视角操作的场景。比如在展示固定路线的飞行演示时,如果允许用户随意旋转地图,可能会打乱预设的动画效果;在嵌入式…...
