非常教程

JavaScript参考手册

对象 | Object

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

示例

使用watchunwatch

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

JavaScript

JavaScript 是一种高级编程语言,通过解释执行,是一门动态类型,面向对象(基于原型)的解释型语言。它已经由ECMA(欧洲电脑制造商协会)通过 ECMAScript 实现语言的标准化。它被世界上的绝大多数网站所使用,也被世界主流浏览器( Chrome、IE、FireFox、Safari、Opera )支持。JavaScript 是一门基于原型、函数先行的语言,是一门多范式的语言,它支持面向对象编程,命令式编程,以及函数式编程。它提供语法来操控文本、数组、日期以及正则表达式等,不支持 I/O,比如网络