监听数组变动并触发额外任务:使用 Proxy 实现数组属性的实时更新


监听数组变动并触发额外任务:使用 proxy 实现数组属性的实时更新

本文旨在解决当实例字段为数组时,如何监听数组的变动(例如 push 或 splice 操作)并执行额外任务的问题。通过使用 J*aScript 的 Proxy 对象,我们可以拦截对数组 length 属性的修改,从而在数组发生变化时触发自定义逻辑,例如更新 sessionStorage。本文将提供详细的代码示例和解释,帮助开发者理解和应用这一技术。

当我们需要在一个类的实例字段(该字段是一个数组)发生变化时,执行一些额外的操作,比如更新 sessionStorage,直接使用 set 访问器是无法实现的。因为 push、splice 等数组方法并不会触发 set 访问器。 为了解决这个问题,我们可以使用 J*aScript 的 Proxy 对象。

使用 Proxy 监听数组变动

Proxy 对象可以拦截对象的操作,包括属性的读取、赋值、删除等。我们可以创建一个 Proxy 对象来代理数组,并拦截对数组 length 属性的修改。当数组的 length 属性发生变化时,我们就可以执行额外的任务。

以下是一个示例代码:

YouMind YouMind

AI内容创作和信息整理平台

YouMind 207 查看详情 YouMind
class Environment {
  constructor() {
    // 初始化数组,从 sessionStorage 获取或创建一个空数组
    const crumbList =
      JSON.parse(sessionStorage.getItem('crumbs') ?? null) ?? [];

    this.crumbs = new Proxy(crumbList, {
      set(obj, prop, value) {
        // debugger; // 可以使用 debugger 进行调试
        // console.log({ obj, prop, value }); // 打印相关信息

        // 执行默认的 set 操作
        const result = Reflect.set(...arguments);

        // 只有当修改的是 length 属性时,才执行额外的任务
        if (prop === 'length') {
          // 更新 sessionStorage
          sessionStorage.setItem('crumbs', JSON.stringify(crumbList));
        }
        return result;
      }
    });
    // 添加 valueOf 方法,返回数组的浅拷贝
    Object.defineProperty(this.crumbs, 'valueOf', {
      value: function valueOf () {
        return [...crumbList];
      },
    });
  }
}

const env = new Environment();

const metricId = 6;
const concept = 'Back orders';

const crumb = { metricId, concept };

env.crumbs.push(crumb);

env.crumbs.push('foo');
env.crumbs.push('bar');

env.crumbs.length = 5;

env.crumbs.push('baz');
env.crumbs.push('biz');

env.crumbs.length = 9;

console.log('... after initial `push` operations and `crumbs.length` changes ...');
console.log({ "current value": env.crumbs });

env.crumbs.shift();
env.crumbs.pop();
env.crumbs.pop();

console.log('... after `shift` and `pop` operations ...');
console.log({ "current value": env.crumbs });

env.crumbs.splice(1, 3);

console.log('... after a final `splice` operation ...');
console.log({ "current valueOf()": env.crumbs.valueOf() });

console.log({ "currently stored JSON": sessionStorage.getItem('crumbs') });

代码解释:

  1. Environment 类: 该类维护一个名为 crumbs 的数组属性,该属性实际上是一个 Proxy 对象。
  2. constructor 构造函数:
    • 从 sessionStorage 中尝试获取名为 'crumbs' 的数据,如果存在则解析为 JSON,否则初始化为空数组。
    • 创建 Proxy 对象,并将 crumbList 作为目标对象。
    • set 陷阱函数拦截对 Proxy 对象属性的设置操作。
    • 在 set 陷阱函数中,首先使用 Reflect.set(...arguments) 执行默认的属性设置操作。
    • 判断被设置的属性是否为 length,如果是,则将 crumbList 转换为 JSON 字符串并存储到 sessionStorage 中。
    • 添加 valueOf 方法,返回数组的浅拷贝,方便查看数组内容。
  3. Proxy 对象: Proxy 对象的第二个参数是一个处理程序对象,该对象定义了拦截操作。在本例中,我们只定义了 set 陷阱函数,用于拦截属性设置操作。
  4. set 陷阱函数:
    • obj: 目标对象(即 crumbList 数组)。
    • prop: 被设置的属性名。
    • value: 被设置的属性值。
    • Reflect.set(...arguments): 用于执行默认的属性设置操作。如果不执行该操作,则属性设置将不会生效。
    • sessionStorage.setItem('crumbs', JSON.stringify(crumbList)): 将 crumbList 数组转换为 JSON 字符串并存储到 sessionStorage 中。

注意事项:

  • Proxy 对象只能拦截对 Proxy 对象本身的操作。如果直接操作目标对象(即 crumbList 数组),则 Proxy 对象将不会生效。
  • Reflect.set(...arguments) 必须被调用,否则属性设置将不会生效。
  • 该方法只监听 length 属性的变化,这意味着只有当数组的长度发生变化时,才会触发额外的任务。如果只是修改数组中的元素,而数组的长度没有变化,则不会触发额外的任务。

总结

通过使用 Proxy 对象,我们可以方便地监听数组的变动并执行额外的任务。这种方法可以应用于各种场景,例如数据同步、状态管理等。希望本文能够帮助读者理解和应用这一技术。

以上就是监听数组变动并触发额外任务:使用 Proxy 实现数组属性的实时更新的详细内容,更多请关注其它相关文章!


# 创建一个  # 衢州seo公司找5火星  # 网站优化定制开发服务  # 青海网站建设什么价格  # 保定手机网站建设外包  # 照明行业网站建设专家  # 邹城推广员招聘信息网站  # 保定网站优化排名推广  # 镇江网站建设标准  # SEO黑帽解决方法  # seo后期发展趋势  # 运行机制  # 服务端  # 源代码  # javascript  # 转换为  # 可以使用  # 这一  # 有什么  # 我们可以  # 是一个  # red  # sessionstorage  # proxy  # session  # json  # js  # java 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 《随手记》启用语音备注方法  从HTML表单获取逗号分隔值并转换为NumPy数组进行预测  微信客户端如何找回密码_微信客户端忘记密码找回方法  《百果园》充值余额方法  怎样设置开机后自动运行某个程序_Windows启动文件夹与任务计划【自动化】  在Django单元测试中优雅处理信号:基于环境的条件执行策略  J*aScript大数运算_BigInt使用指南  Golang如何测试结构体方法_Golang reflect方法测试与调用技巧  海外搜索引擎推广效果怎么样,怎么分析效果!  《i莞家》修改昵称方法  雨课堂官网在线登录 网页版雨课堂登录链接  抖音手机分身两个账号怎么切换?分身两个系统是一样的吗?  Golang如何使用log记录日志信息_Golang log日志记录方法总结  纯CSS实现滚动时动态时间轴线条颜色填充效果  漫蛙manwa漫画官网链接_漫蛙manwa最新可用网址推荐  斯宾塞称XGP云游戏“蒸蒸日上”:正在构建一个游戏从未如此唾手可得的未来  C++ cast类型转换总结_C++ reinterpret_cast与const_cast的使用  126手机126邮箱登录_126邮箱手机登录入口官网  Excel如何快速合并单元格内容_Excel文本合并与函数操作技巧  《桃源记2》资源采集攻略  《浙里办》电子发票开具方法  mysql镜像配置如何设置用户权限组_mysql镜像配置用户组与权限分级管理方法  跨语言测试实践:使用Python Selenium测试现有J*a Web项目  TikTok收藏夹无法删除视频如何解决 TikTok收藏管理优化方法  mysql通配符能用于日志查询吗_mysql通配符在系统日志查询中的实际使用方法  抖音网页版地址直接进入_抖音网页版在线观看入口  《糖豆》添加舞曲方法  PDF文件去水印平台入口 PDF水印删除网址  DeepSeek超全面指南:入门必看  太平年在哪个平台播出  《爱笔思画x》涂色教程  抖音号已注销怎么解绑企业认证?不解绑企业认证会怎样?  Yandex俄罗斯搜索引擎官网入口 Yandex网页端直接访问  《撕歌》会员开通方法  如何通过settings.json个性化您的VS Code体验  J*aScript:从子元素中批量移除特定CSS类  Final Cut Pro视频加EQ教程  火柴人战争网页版在线玩  苹果17 Pro如何启用分屏浏览_iPhone 17 Pro分屏浏览设置步骤  J*aScript 数值去小数位处理:多种方法与实践  sublime如何自定义文件类型图标_AFileIcon插件的主题切换与个性化配置  解决CSS background 属性中 cover 关键字的常见误用  Excel如何制作月度销售统计图_Excel动态图表制作与控件应用  win11资源管理器标签页怎么用 Win11文件管理器多标签高效操作【新功能】  微信朋友圈怎么设置三天可见 微信朋友圈设置指定天数可见步骤【教程】  使用Python和NLTK从文本中高效提取名词的实用教程  修复UI元素交互障碍:从“开始”按钮到信息框的平滑过渡实现  Lar*el Dusk 测试中管理浏览器权限:以剪贴板访问为例  PHP动态导航按钮:根据用户登录状态切换链接与文本  《健康大兴》注册方法介绍 

 2025-10-03

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.