使用 Proxy 对象检测 Javascript 数组中的更改

2023-11-30

在 Javascript 中观察数组的变化相对简单。

我使用的一种方法是这样的:

// subscribe to add, update, delete, and splice changes
Array.observe(viewHelpFiles, function(changes) {
  // handle changes... in this case, we'll just log them 
  changes.forEach(function(change) {
    console.log(Object.keys(change).reduce(function(p, c) {
      if (c !== "object" && c in change) {
        p.push(c + ": " + JSON.stringify(change[c]));
      }
      return p;
    }, []).join(", "));
  });
});

然而,我最近读到Array.observe已被弃用,我们应该使用而是代理对象。

我们怎样才能检测到Proxy对象数组的变化呢?我找不到任何例子,有人有兴趣详细说明吗?


从我可以读到的MDN page,您可以创建一个通用处理程序,在其中可以处理对任何对象的所有更改。

从某种意义上说,您编写了一个拦截器,每次从数组获取值或设置值时,它都会进行干预。然后您可以编写自己的逻辑来跟踪更改。

var arrayChangeHandler = {
  get: function(target, property) {
    console.log('getting ' + property + ' for ' + target);
    // property is index in this case
    return target[property];
  },
  set: function(target, property, value, receiver) {
    console.log('setting ' + property + ' for ' + target + ' with value ' + value);
    target[property] = value;
    // you have to return true to accept the changes
    return true;
  }
};

var originalArray = [];
var proxyToArray = new Proxy( originalArray, arrayChangeHandler );

proxyToArray.push('Test');
console.log(proxyToArray[0]);

// pushing to the original array won't go through the proxy methods
originalArray.push('test2');

// the will however contain the same data, 
// as the items get added to the referenced array
console.log('Both proxy and original array have the same content? ' 
  + (proxyToArray.join(',') === originalArray.join(',')));

// expect false here, as strict equality is incorrect
console.log('They strict equal to eachother? ' + (proxyToArray === originalArray));

然后输出:

getting push for 
getting length for 
setting 0 for  with value Test 
setting length for Test with value 1
getting 0 for Test
Test

代理的警告是,在对象上定义的所有内容都将被拦截,这可以在使用时观察到push method.

将被代理的原始对象不会发生变化,并且对原始对象所做的更改不会被代理捕获。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Proxy 对象检测 Javascript 数组中的更改 的相关文章

  • React-native:将场景绑定到导航栏

    我正在整理这个提问 回答应用程序 并遇到了这个障碍 我想从导航栏触发场景中的功能 与登录应用程序类似 我在导航栏中有一个用于提交答案的按钮 RightButton route navigator index navState if rout
  • 如何更改传单中功能集的样式?

    我正在看等值区域的例子 https leafletjs com examples choropleth https leafletjs com examples choropleth 这是他们使用的数据源 type Feature prop
  • Angular 2 链式 Promise 并传递拒绝

    应该是一个简单的问题 但是我找不到有关如何做到这一点的文档 像这样链接一个承诺 Making a promise no problem let promise new Promise resolve reject gt let data d
  • 访问sendBeacon发送的数据

    文档表明sendBeacon通过发送其数据HTTP POST request 但在 PHP 中 POST变量似乎是一个空数组 这是我的 JavaScript 代码 navigator sendBeacon beacon log php My
  • 如何使用 selenium 和 Mocha 获取 xPath() 选择的锚标记的文本

    我已经成功选择了 a 标签 我想显示锚标记的文本 但无法这样做 我正在使用 selenium mocha javascript 和 phantomJS 这是我的脚本 详细 var assert require assert var test
  • 如何使用 JavaScript 中的值填充下拉列表?

    我在 Tridion CMS 扩展中的功能区工具栏按钮中添加了一个按钮 单击该按钮后 将显示一个弹出页面 其中包含两个下拉菜单 通过更改第一个下拉控件中的值 我应该填充第二个下拉控件的值 就我而言 我正在使用ASP drop down li
  • 如何按照编写的顺序迭代 javascript 对象属性

    我发现了代码中的一个错误 我希望通过最少的重构工作来解决该错误 此错误发生在 Chrome 和 Opera 浏览器中 问题 var obj 23 AA 12 BB iterating through obj s properties for
  • 如何使用 jest 模拟第三方库

    我正在开发一个node js应用程序使用nestjs我有一堂课叫LoggerService如下 export class LoggerService private logger Rollbar constructor this logge
  • 仅一页 JavaScript 应用程序

    您是否尝试过单页 Web 应用程序 即浏览器仅从服务器 获取 一页 其余部分由客户端 JavaScript 代码处理 此类 应用程序页面 的一个很好的例子是 Gmail 对于更简单的应用程序 例如博客和 CMS 使用这种方法有哪些优点和缺点
  • HTML2canvas 和 Canvas2image,下载的屏幕截图不显示我的 HTML 图像

    我一直在开发一个 HTML 页面 我想将其转换为图像 我一直在使用 html2canvas 和 canvas2image 脚本并采用此代码http jsfiddle net 8ypxW 3 http jsfiddle net 8ypxW 3
  • 未捕获的错误:找不到模块“jquery”

    我在用Electron https github com atom electron制作桌面应用程序 在我的应用程序中 我正在加载一个外部站点 Atom 应用程序之外 可以说http mydummysite index html http
  • 是否有任何非轮询方式来检测 DOM 元素的大小或位置何时发生变化?

    很长一段时间以来 我一直在寻找一种方法来检测 DOM 元素的大小或位置何时发生变化 这可能是因为窗口调整了大小 或者因为向该元素添加了新的子元素 或者因为在该元素周围添加了新元素 或者因为 CSS 规则已更改 或者因为用户更改了浏览器的字体
  • 当用户单击链接时,如何记录 MixPanel 事件?

    当用户单击某种类型的链接时 我试图在 MixPanel 中记录一个事件 我正在使用 JQuery 不引人注意地完成此操作 据我所知 我需要添加一个回调函数 以便在记录事件后将用户带到 URL 这是我正在使用的代码 不幸的是
  • 如何在jquery中获取保存时间和当前时间的差异?

    我想在 javascript 或 jquery 中获取保存时间和当前时间之间的时差 我节省的时间看起来像Sun Oct 24 15 55 56 GMT 05 30 2010 java中的日期格式代码如下 String newDate 201
  • JavaScript 代码在不使用 ActiveX 的情况下截取网站屏幕截图

    我有一个用户与之交互的 JavaScript 应用程序 我需要保存当前界面的外观 裁剪出我需要的部分 或者通过指定div只拍摄我需要的部分 然后发送回服务器 显然任何外部服务都无法做到这一点 我需要一个 JavaScript 或Flash
  • 如何获取 UIWebView 中元素的位置?

    我在 iPad 程序中加载了 html 的 UIWebView 通过使用 webkit column width 我将 html 分为几列 padding 0px height 1024px webkit column gap 0px we
  • 数据表日期范围过滤器

    如何添加日期范围过滤器 like From To 我开始进行常规搜索和分页等工作 但我不知道如何制作日期范围过滤器 我正在使用数据表 1 10 11 版本 My code var oTable function callFilesTable
  • 如何在 Google 地图 V3 中创建编号地图标记?

    我正在制作一张上面有多个标记的地图 这些标记使用自定义图标 但我还想在顶部添加数字 我已经了解了如何使用旧版本的 API 来实现这一点 我怎样才能在V3中做到这一点 注意 当您将鼠标悬停在标记上时 标题 属性会创建一个工具提示 但我希望即使
  • 如何在打字稿文件中导入没有定义文件的js库

    随着我们的项目变得越来越大 我想从 JavaScript 切换到 TypeScript 以帮助进行代码管理 然而 我们使用许多库作为 amd 模块 我们不想将其转换为 TypeScript 我们仍然想将它们导入 TypeScript 文件
  • 在 GWT 中,在任何主机页标记上添加事件处理程序

    我想为任何标签添加 MouseOver 事件处理程序 举个例子 我想为旧版 HTML 页面中的每个锚点页面添加事件处理程序 继GWT指南 http code google com webtoolkit doc 1 6 DevGuideUse

随机推荐

  • 在多个浏览器中测试/检查网络应用程序的软件/工具?

    我正在创建一个网站 我想使用自动化测试工具自动检查多个浏览器以进行浏览器兼容性测试 你们知道是否有任何软件 工具 我可以只提供一个链接 然后在多个浏览器中加载页面 我用过浏览器截图之前 如果你不介意等一两个小时也没关系 我还建议您查看一些链
  • 内部类出现“范围内没有类型 file1 的封闭实例”错误

    我有一些代码 本质上它导入了另一个类 它有一个我试图访问的内部类 但它提出了这个错误 file2 java 5 error no enclosing instance of type file1 is in scope public sta
  • 使用 Java 访问 Android Manifest 属性

    这是清单示例 是否可以从 Java 访问属性 versionCode 和 versionName 如何
  • 写入有符号整数就像在 C++ 中写入无符号整数一样

    Is reinterpret cast这样做是安全的 这是最好的方法吗 例如 在下面的代码中 我有一个名为ibytestream 这允许读取uint16 ts and int16 t是从它 ibytestream next is a vec
  • 如何使用纯 javascript 将子级附加到具有指定类名的所有节点

    var menuheader document createElement li document getElementsByClassName subMenu appendChild menuheader 上面是代码片段 我收到此错误 f
  • NetBeans 12.6 的 TAB 和缩进问题

    交易是这样的 如果我在一行代码中使用 TAB 键 效果很好 我按下它 它会正常插入空格 如果我转到一个新行 一个没有代码的空行 它就不起作用 无论 像这样 System out pri nt 这是第一个问题 第 2 号 缩进 如果我在任意位
  • 在 jquery datetimepicker 中设置最大和最小日期时间

    我正在使用jquery datetimepicker 我想在其中设置mindate和时间 这是在第二个datetimepicker中选择的值 我尝试的是 date start datetimepicker autoSize true cha
  • 在运行时检查 Python 模块版本

    许多第三方 Python 模块都有一个属性 用于保存模块的版本信息 通常类似于module VERSION or module version 但有些则不然 此类模块的具体示例是 libxslt 和 libxml2 我需要检查运行时是否使用
  • 为什么这个 BASH 数组没有构建?

    为什么这个 bash 数组没有填充 我相信我过去也这样做过 回声 XECOMMAND 显示无数据 DIR 1 TEMPFILE tmp dir tmp ls l DIR tail n 2 sed s s g cut d f5 9 gt TE
  • 为什么这个嵌套的 content_tag 无法正确呈现?

    我的助手中有这个 def favorites count node content tag span class card favorite count do content tag i class icon heart node cach
  • 如何有选择地更新 wpf 中的模型

    当单击 listviewitem 时 我会在列表视图中显示模型列表 我打开一个绑定到 listviewitem 数据模型的对话框 并允许用户编辑各种属性 我正在尝试弄清楚如何处理 确定 和 取消 按钮 一方面 如果我将对话框直接绑定到列表视
  • Xcode单一窗口,显示来自xib文件的自定义视图

    我正在创建一个 OSX 应用程序 它有一个窗口 该窗口包含一个视图 在整个使用过程中呈现不同的视图 我目前的做法 在默认的 MainMenu xib 中 我在默认生成的窗口 这是我将使用的窗口 中为自定义视图创建了一个出口 我们就这样称呼它
  • 我可以用 C++ 扩展 lisp 吗?

    我可以从用 c 或 c 编写的库中调用 lisp 函数吗 我怎样才能扩展 lisp 当您想要执行一些系统调用或类似的操作时 这非常有用 从 lisp 调用非 lisp 代码的情况很少见 而且很少有必要 CLX CL 的 X11 客户端实现
  • 在 Swift 中,可以使用字符串来访问结构体属性吗?

    我有一个结构 我想知道是否可以使用括号语法访问变量 这是我的结构 import UIKit public struct Pixel public var value UInt32 public var red UInt8 public va
  • Objective-C 解密 AES 128 cbc 十六进制字符串

    我正在使用 Xcode 3 1 在 Snow Leopard 上为 iPhone 开发一个应用程序 该应用程序从 Restful Web 服务接收使用 AES 128 位 CBC 算法的十六进制格式的加密文本 该算法使用初始化向量 密钥 我
  • Android,从元素中删除边距和填充

    我有一个包含 LinearLayout 水平 的活动 我希望 LinearLyout 内的所有元素都被附加 没有边距或填充 我尝试了很多方法但没有效果 这是我最后一次尝试
  • IE8 返回“预期对象”[].slice.call [重复]

    这个问题在这里已经有答案了 我是 js 新手 这段代码适用于除 li 元素 选项卡 之外的所有浏览器 function slice call document querySelectorAll tabs forEach function e
  • 在 Windows 命令行上设置应用程序的窗口位置

    我有一个从桌面位置 0x0 开始的应用程序 我想在桌面中央打开它 我不想打开它并使用移动命令将其移动到中心 而是我的应用程序应该立即在中心位置启动 有什么方法可以通过命令提示符执行此操作吗 您将需要一个额外的实用程序 例如cmdow exe
  • 父节点移动时子节点不移动?

    我的世界有三个节点 玩家和 玩家视野 世界和视觉 SKShapeNodes 和我的玩家都使用 SKShapeNode 的自定义子类 当我移动世界时 所有玩家都会随之移动 但是当我移动玩家时 视觉节点保持固定在其位置 这可能是什么原因 这是我
  • 使用 Proxy 对象检测 Javascript 数组中的更改

    在 Javascript 中观察数组的变化相对简单 我使用的一种方法是这样的 subscribe to add update delete and splice changes Array observe viewHelpFiles fun