Javascript 对象中属性值更改的监听器

2023-11-24

浏览 Javascript 文档,我发现 Javascript 对象上的以下两个函数看起来很有趣:

.watch- 监视要为属性分配值并在发生时运行函数。
.unwatch- 删除使用 watch 方法设置的观察点。


UPDATE: 弃用警告
不使用watch() and unwatch()!这两个 方法仅在Firefox之前的版本58, 他们是 已弃用并删除Firefox 58+


使用示例:

o = { p: 1 };
o.watch("p", function (id,oldval,newval) {
    console.log("o." + id + " changed from " + oldval + " to " + newval)
    return newval;
});

每当我们改变“p”的属性值时,这个函数就会被触发。

o.p = 2;   //logs: "o.p changed from 1 to 2"

过去几年我一直在研究 Javascript,但从未使用过这些函数。
有人可以提出一些好的用例来让这些功能派上用场吗?


现在已经是 2018 年了,这个问题的答案有点过时了:

  • 对象.watch and 对象观察两者均已弃用,不应使用。
  • 属性更改时是一个 DOM 元素事件处理程序,仅适用于某些版本的 IE。
  • 对象.defineProperty允许您使对象属性不可变,这将允许您检测尝试的更改,但它也会阻止任何更改。
  • 定义 setter 和 getter可以,但它需要大量的设置代码,并且当您需要删除或创建新属性时它不能很好地工作。

Today, 您现在可以使用Proxy object监视(并拦截)对对象所做的更改。它是专门为 OP 想要做的事情而构建的。这是一个基本示例:

var targetObj = {};
var targetProxy = new Proxy(targetObj, {
  set: function (target, key, value) {
      console.log(`${key} set to ${value}`);
      target[key] = value;
      return true;
  }
});

targetProxy.hello_world = "test"; // console: 'hello_world set to test'

唯一的缺点是Proxy对象是:

  1. The Proxy对象在较旧的浏览器(例如 IE11)中不可用,并且polyfill无法完全复制Proxy功能。
  2. 代理对象并不总是按照特殊对象的预期运行(例如,Date) - 这Proxy对象最好与普通对象或数组配对。

如果您需要观察对嵌套对象,那么你需要使用专门的库,例如可观察的苗条(我创作的)。它的工作原理如下:

var test = {testing:{}};
var p = ObservableSlim.create(test, true, function(changes) {
    console.log(JSON.stringify(changes));
});

p.testing.blah = 42; // console:  [{"type":"add","target":{"blah":42},"property":"blah","newValue":42,"currentPath":"testing.blah",jsonPointer:"/testing/blah","proxy":{"blah":42}}]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Javascript 对象中属性值更改的监听器 的相关文章

随机推荐

  • 确定 Activity 是否由通知调用

    我正在使用一个活动与各种Tabs在上面 从应用程序的不同部分创建通知来告诉用户某些内容已发生更改 我现在设法致电Activity 当用户点击通知 但我如何确定是否Activity是在运行时以 正常 方式创建的还是通过单击通知创建的 根据单击
  • MySQL:如何对每小时的数据进行分组并获取最新的小时

    我正在尝试执行一个查询来获取数据hour但我不想按小时进行正常分组 而是想缩小范围 只得到latest小时 表示该小时内的最新数据 如下图所示 我想要得到的是带有红色框的行 如果你注意到的话 第一个红行是10 59 51这意味着它是其中唯一
  • 当用户将手指拖动到按钮区域时触发 UIButton 的方法?

    我想要一个在以下条件下触发其方法的按钮 当用户点击按钮时 当用户按下按钮并将手指拖出按钮区域时 当用户将手指从按钮区域外部拖动到按钮区域内部时 基本上 每当触摸按钮的任何部分时 无论触摸的来源如何 我都希望触发该方法 但希望通过操作 UIB
  • SQL:获取在特定日期的时间范围内创建的记录

    我有一组上周创建的记录 我只想从中检索 6 点 45 分到 19 点 15 分之间创建的记录 我有一个专栏creation date我可以使用 我怎样才能在sql中做到这一点 在 Oracle 中 我们可以将日期转换为数字 并以多种方式对其
  • 在 md-sidenav-layout 内时,md-toolbar 可以固定在顶部吗?

    我真的在这里很挣扎 我们正在使用 md sidenav layout 并发现不可能想出一种方法将 md toolbar 固定到页面顶部 lt md toolbar gt lt fix this so content scrolls unde
  • 在rails中生成javascript的完整url(类似于javascript_path,但是是url)

    怎么可能生成一个absolute链接到 JavaScript 文件 我认为应该有类似下面的内容 不幸的是似乎不可用 javascript url main gt http localhost 3000 javascripts main js
  • SQLAlchemy,对多个表使用相同的模型

    我的特定实体的数据分布在多个相同的表中 通常按时间顺序或数字范围分隔 例如 我可能有一个名为 mytable 的表来存储当前数据 一个名为 mytable 2013 的表来存储去年的数据 mytable 2012 等等 仅当前表被写入 其他
  • 将枚举器添加到枚举中是否会破坏 ABI?

    特别是 我在库接口中得到以下代码 typedef enum state1 state2 state3 state4 state5 state error 1 State 我严格禁止破坏 ABI 但是 我想添加state6和state7 它会
  • git "rebase --preserve-merges" 到底是做什么的(为什么?)

    Git s 的文档rebase command非常简短 preserve merges Instead of ignoring merges try to recreate them This uses the interactive ma
  • RStudio 中的 SparkR.init(master="local") 中的 SparkR 错误

    我已将 Spark 发行版中的 SparkR 包安装到 R 库中 我可以调用以下命令 它似乎工作正常 library SparkR 但是 当我尝试使用以下代码获取 Spark 上下文时 sc lt sparkR init master lo
  • Dapper 和 varchar

    我发现以下评论Dapper NET 项目主页 Dapper 支持 varchar 参数 如果您使用参数在 varchar 列上执行 where 子句 请确保以这种方式传递它 Query
  • 我如何在 jquery 中将特定高度设置为 100%

    我想对 div 中的内容进行一些 预览 因此我将其做得很小 只显示第一行 现在我想对其进行动画处理 当您单击标题时 div 的高度将为 100 但是当我使用 animate height 100 时 没有很好的滑动 a href class
  • 如何解决警告:元素“entityFramework”具有无效的子元素“providers”。预期可能元素的列表:“上下文”

    我正在尝试使用 EF 不同的工作流程 昨天我做了一个新项目Entity Framework 6是第一个建议Nuget所以我决定尝试一下 而且这是一个非常小的项目 完全用于学习目的 所以我想尝试一下会是很好的经验EF 6因为我主要与Ef 5
  • 在 64 位机器上添加 32 位版本的 Qt 5.7

    想要手动安装 32 位版本的 Qt 5 7这样我不仅可以将我的应用程序部署到 32 位机器上 还可以部署到 64 位机器上 最初当我将其安装在我的 64 位 Windows 7 计算机上 我只选择了 64 位组件 因此 我只能选择 MSVC
  • Spring Boot自定义404错误页面

    我希望有自定义 404 错误页面 我的类路径中有速度 但我不想使用速度视图解析器 下面是我的代码 EnableAutoConfiguration exclude VelocityAutoConfiguration class Compone
  • Stax XMLStreamReader 检查下一个事件而不继续前进

    我有一个大XML包含许多事件的文件 我想unmarshal他们 由于文件很大 我想unmarshal它们一一对应 因此整个文件不会存储在内存中 它适用于某些事件 但对某些事件失败 因为它无法映射到特定类 因为它已经在下一个事件中 注意 我知
  • 如何获取分配给多 GPU 节点上的 SLURM 作业的 GPU ID?

    当我使用选项 gres gpu 1 向具有两个 GPU 的节点提交 SLURM 作业时 如何获取为该作业分配的 GPU ID 是否有用于此目的的环境变量 我使用的 GPU 都是 nvidia GPU 谢谢 您可以通过环境变量获取GPU id
  • WPF 文本块与椭圆重叠

    我正在尝试在 WPF 中创建它 我意识到我可以只使用图像 但我正在尝试学习 WPF source 这是我到目前为止所拥有的 但它没有产生所需的结果 因为文本框似乎完全隐藏了椭圆 而它应该只是有一个透明的背景
  • C++ 将文件的所有字节放入字符数组中?

    Given const string inputFile C MyFile csv char buffer 10000 如何将文件的字符读入上述缓冲区 我一直在网上四处寻找 但似乎没有一个答案有效 他们都希望调用 getline NOTE
  • Javascript 对象中属性值更改的监听器

    浏览 Javascript 文档 我发现 Javascript 对象上的以下两个函数看起来很有趣 watch 监视要为属性分配值并在发生时运行函数 unwatch 删除使用 watch 方法设置的观察点 UPDATE 弃用警告不使用watc