在线文档教程

object.watch

object.watch

警告:通常你应该避免使用,watch()unwatch()在可能的情况下。这两种方法仅在 Gecko 中实现,主要用于调试。另外,使用观察点会对性能产生严重的负面影响,在使用全局对象时尤其如此,例如window。你通常可以使用 setter 和 getters 或者代理。详情请参阅浏览器兼容性。另外,不要混淆Object.watch使用Object.observe

watch()方法监视属性被分配一个值并在发生时运行一个函数。

语法

obj.watch(prop, handler)

参数

prop要在其上监视更改的对象的属性的名称。handler指定属性值更改时调用的函数。

返回值

undefined.

描述

用于赋值给prop此对象中指定的属性的手表,handler(prop, oldval, newval)每当prop设置时调用并将返回值存储在该属性中。观察点可以通过返回修改newval(或返回oldval)来过滤(或取消)赋值。

如果您删除了设置了观察点的属性,则该观察点不会消失。如果稍后重新创建属性,则观察点仍然有效。

要移除观察点,请使用该unwatch()方法。默认情况下,该watch方法由后继的每个对象继承Object

JavaScript 调试器具有与此方法提供的功能类似的功能,以及其他调试选项。有关调试器的信息,请参阅 Venkman

在 Firefox 中,handler只能从脚本中调用,而不是从本机代码调用。例如,如果用户单击指向当前文档中的锚点的链接,window.watch('location', myHandler)则不会调用myHandler。但是,window.location += '#myAnchor'会打电话myHandler

注意:调用watch()特定属性的对象会覆盖为该属性附加的任何以前的处理程序。

示例

使用watch和unwatch

var o = { p: 1 }; o.watch('p', function (id, oldval, newval) { console.log('o.' + id + ' changed from ' + oldval + ' to ' + newval return newval; } o.p = 2; o.p = 3; delete o.p; o.p = 4; o.unwatch('p' o.p = 5;

该脚本显示以下内容:

o.p changed from 1 to 2 o.p changed from 2 to 3 o.p changed from undefined to 4

使用watch来验证一个对象的属性

您可以使用watch来测试对对象属性的任何赋值。这个例子确保每个人总是有一个有效的名字和年龄在0到200之间。

Person = function(name, age) { this.watch('age', Person.prototype._isValidAssignment this.watch('name', Person.prototype._isValidAssignment this.name = name; this.age = age; }; Person.prototype.toString = function() { return this.name + ', ' + this.age; }; Person.prototype._isValidAssignment = function(id, oldval, newval) { if (id === 'name' && (!newval || newval.length > 30)) { throw new RangeError('invalid name for ' + this } if (id === 'age' && (newval < 0 || newval > 200)) { throw new RangeError('invalid age for ' + this } return newval; } will = new Person('Will', 29 console.log(will // Will, 29 try { will.name = ''; } catch (e) { console.log(e } try { will.age = -4; } catch (e) { console.log(e }

该脚本显示以下内容:

Will, 29 RangeError: invalid name for Will, 29 RangeError: invalid age for Will, 29

产品规范

不是任何规格的一部分。在 JavaScript 1.2中实现。

浏览器兼容性

FeatureChromeEdgeFirefoxInternet ExplorerOperaSafari
Basic SupportNoNo(Yes)NoNoNo

FeatureAndroidChrome for AndroidEdge mobileFirefox for AndroidIE mobileOpera AndroidiOS Safari
Basic SupportNoNoNo(Yes)NoNoNo