优化 JavaScript 类中缓存属性处理的技巧

 优化 JavaScript 类中缓存属性处理的技巧

本文旨在提供一种更简洁高效的方法来处理 javascript 类中的缓存属性,避免冗余的重复代码。通过使用装饰器函数和空值合并赋值运算符(??=),我们可以显著简化缓存逻辑,提高代码的可读性和可维护性。文章将提供详细的代码示例和解释,帮助开发者理解和应用这种优化方案。

在 JavaScript 类中,为了避免重复计算,经常需要对方法的返回值进行缓存。一种常见的做法是在方法内部检查缓存变量是否存在,如果不存在则进行计算并缓存,然后返回缓存的值。然而,当类中存在大量需要缓存的方法时,这种方式会导致大量的重复代码,降低代码的可读性和维护性。本文将介绍一种更优雅的解决方案,通过使用装饰器函数和空值合并赋值运算符(`??=`),可以显著简化缓存逻辑。### 使用装饰器函数实现缓存装饰器函数是一种可以修改或增强函数行为的模式。我们可以创建一个装饰器函数,专门用于处理缓存逻辑,然后将其应用到需要缓存的方法上。以下是一个名为 `enableCache` 的装饰器函数的示例:“`javascriptfunction enableCache(func) { const cache = {}; return function(…args) { const key = JSON.stringify([this, …args]); return (cache[key] ??= { value: func.apply(this, args) }).value; };}

这个 enableCache 函数接受一个函数 func 作为参数,并返回一个新的函数。当调用返回的新函数时,它首先检查缓存 cache 中是否存在对应于当前 this 和 args 的缓存值。如果缓存不存在,则调用原始函数 func 计算结果,并将结果存储在缓存中,然后返回缓存的值。

代码解释:

const cache = {};: 定义一个 cache 对象,用于存储缓存的结果。 键值对的键是函数调用参数的 JSON 字符串,值是包含 value 属性的对象,value 属性存储函数的返回值。return function(…args) { … }: 返回一个闭包,这个闭包是实际被调用的函数。它接收任意数量的参数 …args。const key = JSON.stringify([this, …args]);: 创建一个缓存键。 使用 JSON.stringify 将 this (函数执行上下文) 和所有参数转换为字符串,以便用作 cache 对象的键。(cache[key] ??= { value: func.apply(this, args) }).value;: 这是缓存的核心逻辑。cache[key] ??= { value: func.apply(this, args) }: 使用空值合并赋值运算符 ??=。如果 cache[key] 的值为 null 或 undefined,则将 { value: func.apply(this, args) } 赋值给 cache[key]。 func.apply(this, args) 调用原始函数 func,并传入正确的 this 上下文和参数。.value: 访问缓存对象的 value 属性,即函数的返回值。

应用装饰器函数到类的方法

为了方便地将 enableCache 装饰器函数应用到类的多个方法上,我们可以创建一个名为 enableCacheOnMethods 的辅助函数:

function enableCacheOnMethods(cls) {    const obj = cls.prototype;    for (const method of Object.getOwnPropertyNames(obj)) {        if (typeof obj[method] === "function" && method !== "constructor") {            obj[method] = enableCache(obj[method]);        }    }}

这个 enableCacheOnMethods 函数接受一个类 cls 作为参数,然后遍历该类的原型对象上的所有方法。对于每个方法,它都会调用 enableCache 函数来包装该方法,从而实现缓存功能。

立即学习“Java免费学习笔记(深入)”;

代码解释:

const obj = cls.prototype;: 获取类的原型对象。类的所有方法都定义在原型对象上。for (const method of Object.getOwnPropertyNames(obj)) { … }: 遍历原型对象的所有属性名。 Object.getOwnPropertyNames 返回一个数组,包含原型对象的所有属性名,包括不可枚举的属性。if (typeof obj[method] === “function” && method !== “constructor”) { … }: 检查当前属性是否是一个函数,并且不是构造函数。 我们只需要缓存普通的方法,而不需要缓存构造函数。obj[method] = enableCache(obj[method]);: 使用 enableCache 装饰器函数包装当前方法,并将包装后的函数重新赋值给原型对象上的同名属性。

示例

以下是一个使用 enableCache 和 enableCacheOnMethods 函数的完整示例:

class myClass {    divisors(n) {        console.log(`executing divisors(${n})`);        const arr = [];        for (let i = 2; i  1) res *= n--;        return res;    }}enableCacheOnMethods(myClass);let obj = new myClass;console.log(...obj.divisors(15));console.log(...obj.divisors(48));console.log(obj.factorial(10));console.log(...obj.divisors(15)); // 使用缓存console.log(obj.factorial(10)); // 使用缓存

在这个示例中,divisors 和 factorial 方法都会被缓存。当第一次调用这些方法时,会执行实际的计算,并将结果存储在缓存中。后续对相同参数的调用将直接从缓存中返回结果,而不会再次执行计算。

注意事项

缓存键的生成方式需要仔细考虑,确保能够唯一标识不同的函数调用。在上面的示例中,我们使用 JSON.stringify([this, …args]) 来生成缓存键。对于包含循环引用的对象,这种方式可能会导致错误。缓存的大小需要进行控制,避免占用过多的内存。可以考虑使用 LRU (Least Recently Used) 等缓存淘汰算法。装饰器函数会修改类的原型对象,可能会影响到其他使用该类的代码。

总结

通过使用装饰器函数和空值合并赋值运算符,我们可以显著简化 JavaScript 类中缓存属性的处理逻辑。这种方法不仅可以减少重复代码,提高代码的可读性和维护性,还可以提高代码的性能。在实际开发中,可以根据具体的需求选择合适的缓存策略和缓存键生成方式。


以上就是优化 JavaScript 类中缓存属性处理的技巧的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1533218.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Docassemble中利用AJAX与屏幕刷新实现动态联动下拉列表
上一篇 2025年12月21日 00:23:47
正确处理React TextArea的onChange事件:捕获值与状态更新
下一篇 2025年12月21日 00:23:56

相关推荐

  • excel如何一次性取消所有超链接_excel批量删除超链接技巧

    1、使用“查找和替换”功能,输入^k并全部替换为空,可保留文本清除超链接;2、通过VBA宏执行ActiveSheet.Hyperlinks.Delete命令,一键删除当前页所有超链接;3、复制数据后以“值”或“无格式文本”粘贴,即可去除超链接保留纯文本内容。 如果您在Excel中处理包含大量超链接的…

    2026年8月26日
    100
  • VSCode怎么调出HTML模板_VSCode快速生成HTML基础模板结构教程

    答案:在VSCode中输入!后按Tab键即可快速生成HTML5模板,也可使用html:5或doc等Emmet缩写,若失效需检查文件类型和设置,还可通过自定义snippets.json实现个性化模板。 在VSCode中快速生成HTML基础模板结构,最直接也最常用的方法就是利用其内置的Emmet功能。你…

    2026年8月26日
    000
  • 如何高效集成PipedriveCRM?devio/pipedrive助你轻松搞定!

    可以通过一下地址学习composer:学习地址 想象一下,你的php应用需要和pipedrive crm无缝对接:每当用户在你的网站上提交一个表单,你就需要自动在pipedrive中创建一个新的联系人或交易;或者,你需要从pipedrive拉取最新的客户数据,用于你的内部报表系统。听起来很酷,对吗?…

    用户投稿 2026年8月26日
    100
  • 使用JAXB解析带命名空间的XML请求到Java对象

    本文旨在帮助开发者解决在使用JAXB(Java Architecture for XML Binding)将包含命名空间的XML请求解析为Java对象时遇到的`UnmarshalException`异常。通过修改`@XmlRootElement`注解,明确指定命名空间,可以有效解决由于命名空间不匹配…

    2026年8月26日
    000
  • 老柚如何注销账号

    在如今高度数字化的环境中,我们频繁在各类应用中注册账号以享受多样化服务,但有时也会因个人需求变化而选择退出。老柚作为广受用户喜爱的应用之一,若你决定停止使用,掌握正确的账号注销流程显得尤为关键。 一、注销前需注意的事项 在正式申请注销之前,建议你提前完成几项准备工作。首先,务必将与老柚相关的所有重要…

    2026年8月26日
    000
  • 晋江app的“灌溉营养液”有上限吗_晋江营养液灌溉数量与规则说明

    晋江App中,用户每日最多赠送10瓶营养液,支持单本作品上限为5瓶,每日额度零点重置;营养液可通过注册奖励、签到或购买VIP获取;累计灌溉达3000瓶可获“人气园艺师”称号。 如果您在使用晋江App阅读小说时,想要通过“灌溉营养液”来支持作者,但不确定每日或总量是否有上限,以下是关于该功能的具体规则…

    2026年8月26日
    000
  • 星绘屋漫画app漫画下载步骤

    星绘屋漫画app漫画下载操作指南: 1、打开应用后,可通过首页的分类浏览寻找感兴趣的漫画作品,也可以使用顶部搜索框输入关键词查找目标漫画。 2、进入所选漫画的详情界面后,点击右下方的“下载”按钮,随后勾选需要保存到本地的章节,即可开始离线下载。 以上就是星绘屋漫画app漫画下载步骤的详细内容,更多请…

    2026年8月26日
    000
  • Windows安装WSL2

    Windows安装WSL2Windows安装WSL2Windows安装WSL2Windows安装WSL2

    windows subsystem for linux(简称wsl)是一个在windows 10上能够运行原生linux二进制可执行文件(elf格式)的兼容层。 微软官方安装文档地址: https://docs.microsoft.com/en-us/windows/wsl/install-manu…

    2026年8月26日 用户投稿
    000
  • Java中组合优于继承的设计理念

    组合优于继承是Java设计原则,主张通过对象组合实现代码复用,而非继承。它降低耦合、提升灵活性与可维护性。继承导致紧耦合、破坏封装、单继承限制等问题,而组合通过接口依赖、运行时行为切换、多行为集成等优势弥补这些缺陷。实践中应定义行为接口,在类中持有接口引用并注入具体实现。该原则提倡慎用继承,仅在明确…

    2026年8月26日
    000
  • windows提示“此应用已被管理员阻止”怎么办_“此应用已被管理员阻止”的解除方法

    首先检查并修改本地组策略设置,依次进入“用户配置→管理模板→系统”,将“不要运行指定的Windows应用程序”设为“未配置”;若问题仍存,查看AppLocker日志确认是否阻止,必要时禁用Application Identity服务;接着在Windows安全中心关闭SmartScreen筛选器或解除…

    2026年8月26日
    000
  • 如何利用Java使用ConcurrentHashMap处理并发

    ConcurrentHashMap因分段锁和CAS机制提升并发性能,支持原子操作如putIfAbsent、compute、merge,遍历时提供弱一致性视图,适用于高并发场景。 在多线程环境中,ConcurrentHashMap 是 Java 提供的一个高效且线程安全的 Map 实现。它比传统的 H…

    2026年8月26日
    000
  • java中文乱码在线转换 在线工具解决编码问题

    java中文乱码可以通过在线工具解决。1) 使用编码转换工具如convertio,将文件从一种编码转换为另一种。2) 使用编码检测工具如fileformat.info,识别未知编码的文件。3) 统一编码标准,使用版本控制和定期检查,确保编码一致性。 提到Java中文乱码在线转换和解决编码问题,我们首…

    2026年8月26日
    100
  • 什么是java Java编程语言全面介绍

    java是一个强大的编程语言,适用于从小型应用到大型企业级系统的开发。其核心特点包括:一次编写,到处运行:通过jvm实现跨平台运行。面向对象编程:支持类、对象、继承和多态,增强代码组织和灵活性。集合框架:提供如arraylist等工具,简化数据处理。丰富的生态系统:包括异常处理、多线程、lambda…

    2026年8月26日
    000
  • VSCode报错怎么显示中文_VSCode错误信息本地化教程

    安装中文语言包并重启VSCode即可实现错误信息中文显示,具体步骤为:打开扩展商店搜索“Chinese (Simplified) Language Pack”并安装,通过命令面板执行“Configure Display Language”选择“zh-cn”,最后重启编辑器。若仍为英文,需检查loca…

    2026年8月26日
    000
  • MAC电脑的内置摄像头打不开权限在哪里设置_MAC设置内置摄像头权限方法

    首先检查系统隐私权限设置,确保应用已授权访问摄像头;若问题未解决,可尝试重启摄像头服务、重置NVRAM/PRAM、确认用户账户权限并更新系统与应用至最新版本。 如果您尝试使用视频会议软件或拍照应用时发现MAC电脑的内置摄像头无法启动,可能是由于系统权限未正确配置。以下是解决此问题的步骤: 本文运行环…

    2026年8月26日
    000
  • java中的实例是什么意思 实例与对象的概念辨析

    在java中,”实例”是某个类的具体实现,而”对象”是任何可以操作的实体。1.实例是通过new关键字创建的,如string s = new string(“hello”)中的s。2.对象包括所有实例和基本数据类型,如int sp…

    2026年8月26日
    100
  • 夸克AI怎么进行多轮对话_夸克AI深度对话功能使用技巧

    夸克AI怎么进行多轮对话_夸克AI深度对话功能使用技巧夸克AI怎么进行多轮对话_夸克AI深度对话功能使用技巧夸克AI怎么进行多轮对话_夸克AI深度对话功能使用技巧夸克AI怎么进行多轮对话_夸克AI深度对话功能使用技巧

    要实现夸克AI多轮对话,需先开启深度对话模式,在设置中启用“记住对话上下文”功能,并在同一会话内连续提问,使用“刚才说的”等引导词明确上下文,避免切换窗口或模糊指代,若对话混乱可长按消息选择“清除本会话记忆”重置对话链路。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 Dee…

    2026年8月26日 用户投稿
    000
  • 访问新的Win10文件资源管理器技巧

    win10系统如何体验全新的文件资源管理器界面?许多用户为了提升操作效率,都会对文件资源管理器的界面进行个性化设置。不过,您知道吗?win10其实有一个隐藏版的文件资源管理器,它与传统的文件资源管理器有所不同,采用了基于uwp的设计理念,界面更加简洁流畅。如果您对此感兴趣的话,不妨跟随小编一起深入了…

    2026年8月26日
    000
  • 微信公众号小程序怎么做_微信公众号关联小程序开发教程

    微信公众号小程序怎么做_微信公众号关联小程序开发教程微信公众号小程序怎么做_微信公众号关联小程序开发教程微信公众号小程序怎么做_微信公众号关联小程序开发教程微信公众号小程序怎么做_微信公众号关联小程序开发教程

    先完成小程序开发与审核,再通过公众号后台授权绑定。需先注册开发者账号并认证公众号,创建小程序项目后使用微信开发者工具进行开发,提交审核通过后,在公众号后台关联小程序AppID,实现多入口展示与运营联动。 微信公众号关联小程序,核心在于先独立完成小程序的开发与审核,然后通过公众号后台进行简单的授权绑定…

    2026年8月26日 用户投稿
    100
  • 猫眼App卡顿闪退怎么解决_猫眼App运行卡顿闪退故障排除

    首先清理缓存并重启设备,再更新猫眼App至最新版本,若问题仍存在则卸载重装应用,最后检查iOS系统是否需升级以确保兼容性。 如果您在使用猫眼App时遇到页面加载缓慢、操作不流畅或应用突然关闭的情况,可能是由于设备资源不足或软件本身存在问题。以下是解决此问题的步骤: 本文运行环境:iPhone 15 …

    2026年8月26日
    100

发表回复

登录后才能评论
关注微信