许多使用 MVC 或 MDV 的 JavaScript 框架都需要响应对模拟 Web 应用内状态的对象所做的更改。此功能是数据绑定模型的基本组成部分。
您可以通过多种不同的方式监控 JavaScript 对象和 DOM 属性以触发某种操作,但由于性能等各种原因,大多数技术都不理想。
为了提升 Web 应用的性能,我们向 TC39(负责监督 ECMAScript [JavaScript] 开发工作的标准机构)提议了一种名为 Object.observe() 的新方法。
借助 Object.observe(),您可以向任何 JavaScript 对象添加监听器,以便在该对象或其属性发生变化时调用该监听器。
您现在可以在 Chrome Canary 版本 25 中试用此功能。
如需试用此功能,您需要在 Chrome Canary 中启用 Enable Experimental JavaScript 标志,然后重启浏览器。您可以在“about:flags”下找到该标志,如下图所示:

下面是一个简单的示例,展示了如何在对象上设置观察器:
var beingWatched = {};
// Define callback function to get notified on changes
function somethingChanged(changes) {
// do something
}
Object.observe(beingWatched, somethingChanged);
当“beingWatched”对象发生修改时,它会触发回调函数“somethingChanged”,该函数会接收应用于对象的一组更改。
因此,JavaScript 引擎可以自由缓冲多项更改,并在一次调用中将所有更改传递给回调函数。这有助于优化回调,以便您的代码可以执行大量 JavaScript 操作,但只需处理几个回调,因为这些更新会一起批处理。
每当添加、修改、删除或重新配置属性时,系统都会触发回调函数。
观察数组的另一个非常实用的好处是,如果对数组进行了大量更改,您可以使用更改摘要辅助库创建最小更改集,这样客户端 JavaScript 就不必手动扫描数组来检查每个项。
您可以通过在“somethingChanged”回调函数中执行以下操作,轻松迭代每个更改:
function whatHappened(change) {
console.log(change.name + " was " + change.type + " and is now " + change.object[change.name]);
}
function somethingChanged(changes) {
changes.forEach(whatHappened);
}
type 属性用于标识对象发生的情况。以下代码中列出了一些要设置的属性及其关联的类型示例。
beingWatched.a = "foo"; // new
beingWatched.a = "bar"; // updated
beingWatched.a = "bar"; // no change
beingWatched.b = "amazing"; // new
这种技术的一大优势在于,所有监控智能功能都位于 JavaScript 引擎内,这让浏览器能够对其进行良好优化,并让 JavaScript 能够利用此功能实现功能。
在开发过程中,另一个非常实用的功能是,每当对象发生变化时,都可以使用 Object.observe() 触发调试程序。为此,您可以使用类似以下示例的代码。
Object.observe(beingWatched, function(){ debugger; });
以下是有关 Object.observe() 的精彩视频简介,其中详细介绍了该方法。
TC39 标准组织正在征求有关此功能的反馈,因此请试用该功能,并告诉我们您的想法。