1

https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Object/watch

.watch() 方法简而言之:“监视要分配值的属性并在发生这种情况时运行函数。”

长描述形式:“监视分配给此对象中名为 prop 的属性,在设置 prop 时调用 handler(prop, oldval, newval) 并将返回值存储在该属性中。观察点可以过滤(或取消)值分配,通过返回修改后的 newval(或通过返回 oldval)。”

有一个问题要让它在所有浏览器中工作: Object.watch() for all browsers?

我正在寻找类似的东西。我正在寻找的是一种我可以用来适应这个规范的方法:“监视分配给这个对象中的任何属性并在发生这种情况时运行一个函数。” 主要区别在于它是任何属性,并且只是任何特定属性。

有人可以创建这样的方法,或者如果他们知道这样的方法已经存在,链接到它吗?让它在所有浏览器中工作(减去 IE,或者如果 IE9 符合,则减去 IE8)会很有用

编辑:作为我的意思的一个例子,我将展示我需要它的用途。

var DiscreteLine = function (leftBound, length){
  this.positive = [];
  this.negative = [];
  this.length = length;
  this.leftBound = leftBound;
  this.rightBound = leftBound + length

  if (this.leftBound < 0){
    this.negative.length = (leftBound * -1) + 1;
  } else {
    this.negative.length = 0;
  }
  if (this.rightBound >= 0){
    this.positive.length = rightBound + 1;
  } else {
    this.positive.length = 0;
  }

  this.watchObject = new ObjectWatcher(handler(prop, oldval, newval){ /* some stuff */ });

}

然后,例如,如果有人做了以下事情:

theLine = new DiscreteLine(-2, 4);
theLine[-8] = 10;

处理程序将使用参数 ("-8", undefined, 10) 调用。(最终会发生的是,脚本会自动重新计算 leftBound 和 length 属性(就像数组如何自动更新 length 属性一样)。

4

1 回答 1

0

这基本上需要覆盖已定义对象的属性的设置器。据我所知,这只能在 ECMAScript 5(通过Object.defineProperty)中实现,目前,我不确定哪些浏览器支持这个,如果有的话,所以它不会像你问的那样是“跨浏览器” .

编辑:您的示例现在清楚地说明了您的要求。恐怕当向对象添加新属性时,该语言没有提供任何通知方式。在您的示例中,除了用函数调用替换数组表示法之外,您实际上别无选择。

于 2010-08-12T16:09:13.937 回答