Maui 实践:JavaScript 动态生成集合属性的 get/set 代理

news/2025/11/6 18:08:48/文章来源:https://www.cnblogs.com/zhally/p/19197302

Maui 实践:JavaScript 动态生成集合属性的 get/set 代理

原创 夏群林 2025.11.6

一、背景

在我的数独项目的 SudokuFound 类中,需要管理 8 个集合属性,每个集合都需要:

  1. 「读」:返回副本(避免外部直接修改内部数据);
  2. 「写」:校验数组类型 + 检测变化 + 触发事件;
  3. 「统一逻辑」:所有集合的 get/set 行为完全一致。

如果手动为每个集合写 get/set,会出现 3 个问题:

  • 代码冗余:8 个集合需要写 8 组重复代码,后续新增集合还要手动补;
  • 维护成本高:修改逻辑(比如加校验、改事件)需要改 8 个地方,容易漏改;
  • 易出错:手动写代码可能出现语法错误(比如副本创建遗漏、变化检测不一致)。

二、创意

利用 ES6 的 static 代码块(类加载时执行一次)+ Object.defineProperty,自动为所有「合法集合属性」生成统一逻辑的 get/set 代理,完美解决上述痛点。这是一个 静态代码块 + 动态代理 的思路:

  1. 「筛选合法属性」:自动识别数据载体(如 JsonFound)中所有数组类型的属性(即需要管理的集合);
  2. 「动态生成代理」:为每个合法集合自动生成 get/set 方法,内置「副本返回」「类型校验」「变化检测」「事件触发」逻辑;
  3. 「自动化适配」:后续新增/删除集合属性,无需修改代理逻辑,自动适配。

三、代码

我把这部分代码抽出来,可作为模板直接复用。

  1. 数据载体类,保持纯数据结构,便于前后端通讯
// 纯数据载体:定义需要管理的集合属性(数组类型)
class DataCarrier {constructor() {this.basicProp1 = "默认值"; // 基础属性(非集合)this.basicProp2 = 0;// 待管理的集合属性(数组类型)this.collection1 = [];this.collection2 = [];this.collection3 = [];// 后续新增集合,只需在这里加一行}
}
  1. 带集合属性变化通知功能的轻量包装类,动态生成集合属性代理
class ObservableDataWrapper {constructor() {this.#data = new DataCarrier();// 筛选合法集合属性:仅保留数组类型的属性名this.#validCollectionNames = Object.keys(this.#data).filter(key => Array.isArray(this.#data[key]));}// 私有变量#data; // 内部数据载体实例#validCollectionNames; // 合法集合名称列表(自动筛选)#isEqual; // 深比较工具(用于变化检测)#triggerChange; // 事件触发方法(统一触发布局/UI更新)// 核心:静态代码块(类加载时动态生成 get/set)static {// 步骤1:筛选 DataCarrier 中所有数组类型的属性(合法集合)const validCollections = Object.keys(new DataCarrier()).filter(key => Array.isArray(new DataCarrier()[key]));// 步骤2:为每个合法集合动态生成 get/set 代理validCollections.forEach(collectionName => {Object.defineProperty(this.prototype, collectionName, {// get 方法:返回副本,避免外部直接修改内部数据get() {return [...this.#data[collectionName]];},// set 方法:统一逻辑(校验+变化检测+更新+事件)set(newValue) {// 1. 类型校验:必须是数组if (!Array.isArray(newValue)) return;// 2. 变化检测:深比较新旧数据,无变化则跳过if (this.#isEqual(newValue, this.#data[collectionName])) return;// 3. 安全更新:存储副本,避免外部引用篡改this.#data[collectionName] = [...newValue];// 4. 统一事件:触发变化通知(UI/其他模块监听)this.#triggerChange();},enumerable: true, // 支持 for...in 遍历configurable: true // 允许后续扩展(如重写)});});}// 辅助工具:深比较(简化版,可替换为 lodash.isEqual)#isEqual(a, b) {if (a === b) return true;if (a.length !== b.length) return false;return a.every((item, idx) => item === b[idx]); // 复杂对象需扩展}// 辅助工具:触发事件(统一对外通知)#triggerChange() {// 实际项目中可替换为事件总线。比如,在我的项目: GameUtils.publishEvent。console.log(`集合变化:${JSON.stringify(this.#data)}`);}
}

四、价值

  1. 极致精简代码。8 个集合只需写 1 套逻辑,代码量减少 87.5%。新增集合时,仅需在 DataCarrier 中加一行数组定义,无需修改 ObservableDataWrapper

  2. 逻辑绝对一致。所有集合的 get/set 逻辑完全统一,避免手动写代码导致的差异化 bug。如某个集合漏写副本、某个集合未加校验。

  3. 内置数据安全。get 自动返回副本,外部无法通过 manager.collection1.push(xxx) 直接修改内部数据。set 自动存储副本,外部传入的数组引用变化,不会影响内部数据。类型校验 + 变化检测,避免非法数据写入,减少无效事件触发。

  4. 低成本,高复用。外部使用方式,如manager.collection1 读、manager.collection1 = [1,2,3] 写,和普通属性完全一致,无需学习新 API。「多集合属性管理」场景,直接复用本模板即可。

五、避坑

  1. 合法属性筛选要精准。确保 filter(key => Array.isArray(this.#data[key])) 只筛选需要管理的集合,避免把基础属性(如字符串、数字)误判为集合。

  2. 深比较需适配复杂对象。若集合元素是复杂对象,需扩展 #isEqual 方法,比较对象的核心属性(如 x/yfirst/last),避免“引用不同但内容相同”被误判为变化。

  3. 兼容外部操作逻辑。动态生成的 get/set 是“代理”,是在外部赋值时触发 set 逻辑,无需额外调用方法。如我的项目中, GameStates.SudokuFound.InferenceChain = inference 直接生效。

  4. 调试技巧:若集合操作异常,可在 static 代码块中加日志,确认合法集合是否正确筛选:

  • static {const validCollections = Object.keys(new DataCarrier()).filter(key => Array.isArray(new DataCarrier()[key]));console.log("合法集合:", validCollections); // 调试用// ... 后续生成代理
    }
    

六、适用

这个技巧特别适合以下场景:

  1. 业务类需要管理 多个结构一致的集合属性
  2. 要求所有集合的 读/写行为统一
  3. 希望 减少冗余代码,降低后续维护成本,特别是频繁新增/修改集合的情形。

七、效果

在我的数独项目中,该技巧实现了:

  • 8 个集合属性仅用 20 行代码完成 get/set 代理,后续新增集合无需修改;
  • 外部操作逻辑不变,兼容旧代码;
  • 数据安全问题(如外部篡改内部集合)被彻底解决;
  • 事件触发统一,UI 模块只需监听 sudoku-found-changed 即可感知所有集合变化。

一次编写,多处可用。这个实践,希望对同仁有所助益。

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

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

相关文章

2025小王子亚麻籽薯片工厂推荐榜:小王子亚麻籽薯片厂家实力派承包休闲时光

追剧解馋、露营分享、办公加餐,一款口感出众又兼顾品质的薯片总能点亮日常。2025 年休闲食品市场更看重 “品质溯源、工艺创新、健康适配”,结合市场口碑、技术实力与品质认证,整理出这份高性价比薯片推荐榜,帮你轻…

2025大连养老院机构推荐榜:养老院中心、社区养老院守护舒心晚年

2随着养老需求的多元化发展,选择一家环境适宜、服务贴心的养老院成为许多人的关注重点。2025 年大连甘井子区养老机构推荐榜新鲜出炉,辛寨子社区养老服务中心凭借社区嵌入式优势登顶,另有两家机构凭借特色服务入选,…

Apache是干嘛用的?Apache服务器搭建教程

Apache 是一款开源的 HTTP 服务器软件。简而言之,它是一种帮助计算机向互联网上的其他计算机发送和接收网页的程序。试想一下,Apache 就像是一位餐厅的服务员,负责把菜单(网页)从厨房(服务器)端到桌子(用户的浏…

ewomail docker搭建

docker部署ewomail遇到的一个问题。使用docker部署ewomail,部署中途遇到了域不允许的问题。在网上搜索的到都是配置本地 hosts 就可以解决域不允许问题,但是我配置了无法解决,通过如下方式解决。 docker run -d \-h…

Playwright为什么老是跑不稳?12个坑踩完我终于懂了!

关注 霍格沃兹测试学院公众号,回复「资料」, 领取人工智能测试开发技术合集 周五傍晚,理想的状态是测试报告全绿、CI顺利完成、泡杯咖啡享受下班时光。 如果你的 Playwright 测试套件老是慢、莫名失败、生成一堆无用…

阿里云微服务引擎 MSE 及 API 网关 2025 年 10 月产品动态

阿里云微服务引擎 MSE 及 API 网关 2025 年 10 月产品动态点击此处,了解微服务引擎 MSE 产品详情。

2025年厂房降温设备厂家新推荐排行榜白皮书,厂房降温设备哪个厂家好

2025年工业制造领域持续向绿色高效转型,厂房降温设备作为保障车间生产环境、提升员工效率的核心配套设施,已成为机械加工、物流仓储、食品加工等行业的刚需。然而当前市场中,厂房降温设备厂家数量繁杂且技术实力分化…

android音频低延时设计:Fast Mixer官方文档 - 详解

android音频低延时设计:Fast Mixer官方文档 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

华人数学家反击AI!一场关于和差集问题的突破接力赛

AI 刷新和差集 θ 值后,华人数学家 Fan Zheng 以新方法反超,彰显人机智慧互补。数学的世界里,总有一些难题如同璀璨星辰,华人数学家反击AI!一场关于和差集问题的突破接力赛着无数智者仰望与追逐。在今年5月,Deep…

raft 写请求源码走读

0. 概述 在上一篇文章中介绍了 raft 读请求源码走读,本文继续结合 etcd-raft 源码介绍 raft 写请求流程。 需要说明的是,本文使用的是单节点集群环境,后续会补充多节点集群环境加以介绍。 1. 写请求流程 1.1 客户端…

2025 年在线监测系统厂家最新推荐榜单:洁净环境、尘埃粒子、洁净室、无尘室等设备品牌技术与应用全面解析尘埃粒子在线监测系统/无尘室在线监测系统公司推荐

引言 当前洁净行业对在线监测系统的精度、稳定性需求持续攀升,为帮助企业精准筛选优质设备,本次榜单结合行业协会近一年测评数据编制而成。测评采用 “技术指标 + 场景适配 + 服务能力” 三维评估体系,技术指标方面…

07-WinCC VBS在WinCC中常用实例及函数的用法介绍一

07-WinCC VBS在WinCC中常用实例及函数的用法介绍<一> 1、访问图形编辑器中的对象——ScreenItems用法:dim objset obj=Screenitems([图形对象名称])注意:图形对象名称即在图形编辑器中的按钮、圆、矩形、…

2025年关于准分子气体订做厂家权威推荐榜单:激光气体/激光混合气/准分子激光气体源头厂家精选

在高端制造与科研领域,一瓶高纯度的准分子激光气体,是许多精密设备与工艺的“血液”,其质量直接关系到技术的成败。 准分子激光气体作为激光设备的核心耗材,其纯度、配比精度和稳定性直接决定激光器的工作性能和使…

2025年资质齐全的婚礼酒店排名,口碑好的婚礼酒店机构

2025年南京及周边婚庆市场持续升温,新人对婚宴场地的需求已从有地方办升级为办得省心、办得有面。而资质齐全、口碑过硬、实力雄厚的婚礼酒店,成为新人筹备婚礼的核心选择——它们不仅需具备合规经营资质,更要在场地…

评估工程正成为下一轮 Agent 演进的重点

在 AI 领域里经常提到一个词叫“品味”,这里讲的“品味”,其实就是如何设计评估工程,即对 Agent 的输出进行评价。如果没有评估,就很难理解不同的模型会如何影响我们的用例。作者:马云雷、望宸 导读 在传统软件工…

前端的同学,终于要起飞啦,Github 6.3k star + ,免费可商用的UI元素库!!!

嗨,我是小华同学,专注解锁高效工作与前沿AI工具!每日精选开源技术、实战技巧,助你省时50%、领先他人一步。👉免费订阅,与10万+技术人共享升级秘籍!一个由社区贡献、免费可商用的UI元素库,收录超过 3,000 个(…

基础查找算法(一)概述

基础查找算法(一)概述一 定义 查找算法是计算机科学中用于在数据集合中定位特定元素的重要工具。 1.1 分类及特性算法分类 核心思想 时间复杂度 空间复杂度 适用场景顺序查找 从头到尾逐个比较 O(n) O(1) 无序或小型数…

赋能智慧监管:视频汇聚平台EasyCVR助力智慧电梯监控智能化监管

一、方案背景 在科技持续发展的推动下,城市的现代化建设不断进步,高层的建筑越来越多,电梯使用的需求也随之增加。与此同时,电梯的安全隐患日益增多。比如:电梯在停靠的过程中可能遇到障碍物随之停止运行,或者因…

2025年高性价比宴会会议中心套餐排行榜,靠谱的南京世纪缘宴会中心

2025年酒店餐饮与会议服务行业迎来品质升级浪潮,高性价比宴会套餐、靠谱会议中心服务已成为商务宴请、人生庆典、企业会务的核心需求,其服务专业性、场景适配性、成本可控性直接决定活动效果与客户体验。然而当前市场…