首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

object.watch

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

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

语法

代码语言:javascript
复制
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()特定属性的对象会覆盖为该属性附加的任何以前的处理程序。

示例

使用watchunwatch

代码语言:javascript
复制
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;

该脚本显示以下内容:

代码语言:javascript
复制
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之间。

代码语言:javascript
复制
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);
}

该脚本显示以下内容:

代码语言:javascript
复制
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

扫码关注腾讯云开发者

领取腾讯云代金券