object.watch (Object) – JavaScript 中文开发手册

2021-04-20 03:26

阅读:341


  • ??JavaScript 中文开发手册

    object.watch (Object) - JavaScript 中文开发手册

    警告:通常你应该避免使用,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  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 中文开发手册

  • 评论


    亲,登录后才可以留言!