当前位置: 首页 > news >正文

【阅读笔记】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 接受一个函数当作参数&#xff0c;用户可以自行在该函数内指定排序方式 // 由小到大排序 let res [1, 4, 2].sort((a, …...

设计模式(二十)----行为型模式之责任链模式

1、概述 在现实生活中&#xff0c;常常会出现这样的事例&#xff1a;一个请求有多个对象可以处理&#xff0c;但每个对象的处理条件或权限不同。例如&#xff0c;公司员工请假&#xff0c;可批假的领导有部门负责人、副总经理、总经理等&#xff0c;但每个领导能批准的天数不同…...

数据持久化层--冷热分离

业务场景 有一个系统的主要功能是这样的:它会对接客户的邮件服务器,自动收取发到几个特定客服邮箱的邮件,每收到一封客服邮件,就自动生成一个工单。之后系统就会根据一些规则将工单分派给不同的客服专员处理。 这家媒体集团客户两年多产生了近2000万的工单,工单的操作记…...

Ubuntu16.04系统 VSCode中python开发插件的安装

VSCode中python开发插件的安装 1. python python插件提供了代码分析&#xff0c;高亮&#xff0c;规范化等很多基本功能 2. Python for vscode 3. Python Preview 实时可视化你的代码结果。如果你Leedcode等题时&#xff0c;可以安装这个插件。能为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、问题来了&#xff1a; 所有用户都可以采用该命令吗&#xff1f;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. 俄罗斯套娃信封问题 ★★★ &#x1f31f; 每日一练刷题专栏 C/C 每日一练 ​专栏 Python 每日一练 专栏 1. 提示用户输入的简单菜单 如果用户选择菜单选项1&#xff0c;提示用户输入1到10之间的整数&a…...

人生又有几个四年

机缘 不知不觉&#xff0c;已经来 csdn 创作四周年啦~ 我是在刚工作不到一年的时候接触 csdn 的&#xff0c;当时在学习 node&#xff0c;对 node 的文件相关的几个 api 总是搞混&#xff0c;本来还想着在传统的纸质笔记本上记一下&#xff0c;但是想想我大学记了好久的笔记本…...

第九章:Java集合

第九章&#xff1a;Java集合 9.1&#xff1a;Java集合框架概述 数组、集合都是对多个数据进行存储(内存层面&#xff0c;不涉及持久化)操作的结构&#xff0c;简称Java容器。 数组存储多个数据方面的特点 一旦初始化以后&#xff0c;其长度就确定了。数组一旦定义好&#xff…...

嵌入式学习笔记——STM32的USART通信概述

文章目录前言常用通信协议分类及其特征介绍通信协议通信协议分类1.同步异步通信2.全双工/半双工/单工3.现场总线/板级总线4. 串行/并行通信5. 有线通信、无线通信STM32通信协议的配置方式使用通信协议控制器实现使用IO口模拟的方式实现STM32串口通信概述什么是串口通信STM32F40…...

MySQL性能优化

MySQL性能调优 存储数据类型优化 尽量避免使用 NULL尽量使用可以的最小数据类型。但也要确保没有低估需要存储的范围整型比字符串操作代价更低使用 MySQL 内建的数据类型&#xff08;比如date、time、datetime&#xff09;&#xff0c;比用字符串更快 基本数据类型 数字 整数…...

C语言/动态通讯录

本文使用了malloc、realloc、calloc等和内存开辟有关的函数。 文章目录 前言 二、头文件 三、主界面 四、通讯录功能函数 1.全代码 2.增加联系人 3.删除联系人 4.查找联系人 5.修改联系人 6.展示联系人 7.清空联系人 8.退出通讯录 总结 前言 为了使用通讯录时&#xff0c;可以…...

我用Compose做了一个地图轮子OmniMap

一、前言 半年前&#xff0c;我发布过一篇介绍&#xff1a;Compose里面如何使用地图&#xff0c;比如高德地图 的文章&#xff0c;原本是没有想造什么轮子的✍️ 闲来无事&#xff0c;有一天看到了评论区留言让我把源码地址分享出来&#xff0c;我感觉我太懒了&#xff0c;后来…...

STM32之SPI

SPISPI介绍SPI是串行外设接口(Serial Peripherallnterface)的缩写&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线&#xff0c;并且在芯片的管脚上只占用四根线&#xff0c;节约了芯片的管脚&#xff0c;同时为PCB的布局上节省空间&#xff0c;提供方便…...

02 深度学习环境搭建

1、查看对应版本关系 详细见&#xff1a;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 帮你解释,详细到爆!

偷个懒&#xff0c;用ChatGPT 帮我写段生物信息代码如果 ChatGPT 给出的的代码不太完善&#xff0c;如何请他一步步改好&#xff1f;网上看到一段代码&#xff0c;不知道是什么含义&#xff1f;输入 ChatGPT 帮我们解释下。生信宝典 1: 下面是一段 Linux 代码&#xff0c;请帮…...

【MyBatis】篇三.自定义映射resultMap和动态SQL

MyBatis整理 篇一.MyBatis环境搭建与增删改查 篇二.MyBatis查询与特殊SQL 篇三.自定义映射resultMap和动态SQL 篇四.MyBatis缓存和逆向工程 文章目录1、自定义映射P1:测试数据准备P2:字段和属性的映射关系P3:多对一的映射关系P4:一对多的映射关系2、动态SQL2.1 IF标签2.2 w…...

什么是API?(详细解说)

编程资料时经常会看到API这个名词&#xff0c;网上各种高大上的解释估计放倒了一批初学者。初学者看到下面这一段话可能就有点头痛了。 API&#xff08;Application Programming Interface,应用程序编程接口&#xff09;是一些预先定义的函数&#xff0c;目的是提供应用程序与开…...

比cat更好用的命令!

大家好&#xff0c;我是良许。 作为程序员&#xff0c;大家一定对 cat 这个命令不陌生。它主要的功能就是用来显示文本文件的具体内容。 但 cat 命令两个很重大的缺陷&#xff1a;1. 不能语法高亮输出&#xff1b;2. 文本太长的话无法翻页输出。正是这两个不足&#xff0c;使…...

EdgeDB监控告警:生产环境运维监控体系构建终极指南

EdgeDB监控告警&#xff1a;生产环境运维监控体系构建终极指南 【免费下载链接】edgedb Gel supercharges Postgres with a modern data model, graph queries, Auth & AI solutions, and much more. 项目地址: https://gitcode.com/gh_mirrors/ed/edgedb EdgeDB是一…...

告别复杂配置:用MobaXterm+网线直连,5分钟让树莓派SSH并上网(Windows环境)

极简主义者的树莓派连接方案&#xff1a;MobaXterm全流程实战指南 树莓派作为一款功能强大的微型计算机&#xff0c;在嵌入式开发、物联网项目和教育领域广受欢迎。然而对于许多初学者甚至有一定经验的开发者来说&#xff0c;如何快速、稳定地连接树莓派始终是个令人头疼的问题…...

为什么Windows 11运行不了老游戏?DDrawCompat让经典游戏重获新生

为什么Windows 11运行不了老游戏&#xff1f;DDrawCompat让经典游戏重获新生 【免费下载链接】DDrawCompat DirectDraw and Direct3D 1-7 compatibility, performance and visual enhancements for Windows Vista, 7, 8, 10 and 11 项目地址: https://gitcode.com/gh_mirrors…...

Backlink Pilot:开源SEO自动化工具,提升外链建设效率

1. 项目概述&#xff1a;一个被低估的SEO自动化利器如果你在独立站、内容营销或者SEO领域摸爬滚打过一段时间&#xff0c;肯定对“外链建设”这四个字又爱又恨。爱的是&#xff0c;它确实是搜索引擎排名算法中一个极其重要的权重因子&#xff1b;恨的是&#xff0c;这个过程枯燥…...

Firefly开源中文大模型:指令微调、部署与领域适配实战

1. 项目概述&#xff1a;一个专为中文优化的开源大语言模型最近在开源社区里&#xff0c;Firefly&#xff08;流萤&#xff09;这个项目引起了我的注意。它不是一个通用框架&#xff0c;而是一个经过精心指令微调的大语言模型系列。简单来说&#xff0c;你可以把它理解为一个“…...

京东数据利器:掌握详情与评论资源

在电商高速发展的今天&#xff0c;数据是了解市场、洞察用户需求、优化产品策略的核心利器。京东作为国内领先的电商平台&#xff0c;其商品详情与用户评论数据承载了大量价值信息。掌握这些资源&#xff0c;不仅可以帮助商家、品牌方优化产品策略&#xff0c;还能辅助内容创作…...

在数据爬取项目中集成 Taotoken 大模型 API 进行智能解析

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 在数据爬取项目中集成 Taotoken 大模型 API 进行智能解析 处理海量非结构化网页数据时&#xff0c;传统的规则提取方法往往力不从心…...

多账号矩阵协作架构设计:中小团队多人权限与素材协同实战方案

前言短视频矩阵运营发展到现阶段&#xff0c;早已不是单人单账号的零散运营模式&#xff0c;而是多账号集群 多人分工协作的团队化作业形态。但绝大多数中小团队、本地商家、小型 MCN 都面临同一个技术难题&#xff1a;多账号共用混乱、素材无法共享、操作权限无隔离、发布无审…...

使用 LikeShop 搭建商城的完整流程(从0到上线)

先说结论用 LikeShop 搭建商城&#xff0c;本质可以拆成 5 步&#xff1a;&#x1f449; 部署系统 → 配置基础 → 上架商品 → 打通交易 → 引流运营只要这 5 步跑通&#xff0c;就可以实现“可正常卖货”的商城。一、准备阶段&#xff08;很多人会忽略&#xff09;在动手之前…...

Claude Orchestra:基于Claude模型的AI智能体编排框架实战指南

1. 项目概述&#xff1a;Claude Orchestra 是什么&#xff0c;以及它为何值得关注最近在探索如何将大型语言模型&#xff08;LLM&#xff09;的能力更系统地整合到工作流中时&#xff0c;我遇到了一个名为mianham9042/claude-orchestra的项目。这个名字本身就很有意思——“Cla…...