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中实现。
浏览器兼容性
Feature | Chrome | Edge | Firefox | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|---|
Basic Support | No | No | (Yes) | No | No | No |
Feature | Android | Chrome for Android | Edge mobile | Firefox for Android | IE mobile | Opera Android | iOS Safari |
---|---|---|---|---|---|---|---|
Basic Support | No | No | No | (Yes) | No | No | No |