Object.observe-并非所有主流浏览器都支持,我可以用什么替代?

石榴

我拥有在Chrome浏览器中可以使用的功能,当名为finishLoading的变量更改值时,该功能会打印到控制台。

Object.observe(finishedLoading, function(id, oldval, newval) {
         console.log('finished loading' + id + ' went from ' + oldval + ' to ' + newval);
     }

这在许多其他现代浏览器(例如Firefox,Safari)中不起作用。有没有我可以使用的替代方法会得到更好的支持?谢谢!

布劳哈利

一种更广泛支持的方法是Object.defineProperty例如,defineProperty可用于控制对象的某些属性:

var o = { prop: '' };
Object.defineProperty(o, 'prop', {
  get: function() { return this.value; },
  set: function(newValue) {
    // a certain property is being changed
    alert('is changed');
    this.value = newValue; 
  }
});

o.prop = 'Johnson';

上面的示例显示了如何使用defineProperty以及更改对象o的prop时将调用已定义的setter(set)。

在此参考资料的底部,您可以看到IE-8也支持它,但仅在某些条件下(IE8仅支持在DOM节点上使用的Object.defineProperty)。

但是使用它时要小心,因为这也会因为缺少而将属性分配给窗口对象

var o = { b:''};
Object.defineProperty(o, 'b', {
  get: function() { return value; },
  set: function(newValue) { value = newValue; },
});

o.b = 'abc';
console.log(window.value); // 'abc'

跟踪财产的旧值的方法

这更符合您的要求:

var o = { prop: '' };

Object.defineProperty(o, 'prop', {
  get: function() { return this.propValue; },
  set: function(newValue) {
    // an certain property is being changed
    console.log('old-value: ',this['oldprop']);
    console.log('new-value: ',newValue);
    this.propValue = newValue; 
    this['oldprop'] = this.propValue;
  }
});

o['prop'] = 'joseph';
console.log(o);
o['prop'] = 'jack';
console.log(o);
o['prop'] = 'john';
console.log(o);

通过使用Object.defineProperty观察整个对象

除此之外,您还可以创建一个函数来跟踪整个对象以及是否更改了任何属性:

function observeObject(obj){

  var keys = Object.keys(obj);

  for(var k=0; k < keys.length; k++){

    var key = keys[k];

    (function(key){

      var keyName = key+'value';
      var oldKeyName = 'old'+key+'value';

      obj[oldKeyName] = obj[key];

      Object.defineProperty(obj, key, {
        get: function() { return this[keyName]; },
        set: function(newValue) {

          console.log('old-value: ',this[oldKeyName]);
          console.log('new-value: ',newValue);

          this[keyName] = newValue; 
          this[oldKeyName] = this[keyName];

        }
      });



    })(key);

  }

}


var person = { name : 'jack', age: 26 };

observeObject(person);

person.name = 'john';
person['age'] = 27;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

哪些浏览器支持Object.observe?

来自分类Dev

为什么不赞成使用Object.observe()

来自分类Dev

JavaScript Object.Observe委托

来自分类Dev

JavaScript Object.Observe委托

来自分类Dev

为什么Object.observe()不提供更改的数据路径到回调?

来自分类Dev

原型上的JavaScript Object.observe

来自分类Dev

在document.location上的Object.observe

来自分类Dev

Object.observe / unobserve如何与垃圾回收交互?

来自分类Dev

Object.observe退出以及RxJS和Angular 2

来自分类Dev

不推荐使用“ Object.observe”。Polymer.js

来自分类Dev

闪亮:updateSelectInput()选择了带有observe()的参数

来自分类Dev

attrs。$ observe在Angular指令中有什么作用

来自分类Dev

所有浏览器都支持的缩放替代

来自分类Dev

所有浏览器都支持的缩放替代

来自分类Dev

CSS:并非所有浏览器都支持最高百分比

来自分类Dev

发送HTTP请求时,所有主流浏览器都使用主机头吗?

来自分类Dev

发送HTTP请求时,所有主流浏览器都使用主机头吗?

来自分类Dev

Ext.util.Observable.observe中的ExtJS调用控制器方法

来自分类Dev

为 filterrific_observe_field 增加计时器的正确方法

来自分类Dev

在什么情况下Array.observe的“添加”事件会触发?

来自分类Dev

为什么`observe`和`observeEvent`在输入变量改变时表现不同?

来自分类Dev

角度指令+ $ observe

来自分类Dev

角度$ observe $ apply

来自分类Dev

Cookies功能在除Chrome之外的所有主流浏览器中都能正常运行

来自分类Dev

Cookies功能在除Chrome之外的所有主流浏览器中都能正常运行

来自分类Dev

为什么({} + {})=“ [object Object] [object Object]”?

来自分类Dev

Can't observe computed property

来自分类Dev

Observe package from polymer dart

来自分类Dev

并非所有Web浏览器都信任SSL证书。中级不工作?

Related 相关文章

  1. 1

    哪些浏览器支持Object.observe?

  2. 2

    为什么不赞成使用Object.observe()

  3. 3

    JavaScript Object.Observe委托

  4. 4

    JavaScript Object.Observe委托

  5. 5

    为什么Object.observe()不提供更改的数据路径到回调?

  6. 6

    原型上的JavaScript Object.observe

  7. 7

    在document.location上的Object.observe

  8. 8

    Object.observe / unobserve如何与垃圾回收交互?

  9. 9

    Object.observe退出以及RxJS和Angular 2

  10. 10

    不推荐使用“ Object.observe”。Polymer.js

  11. 11

    闪亮:updateSelectInput()选择了带有observe()的参数

  12. 12

    attrs。$ observe在Angular指令中有什么作用

  13. 13

    所有浏览器都支持的缩放替代

  14. 14

    所有浏览器都支持的缩放替代

  15. 15

    CSS:并非所有浏览器都支持最高百分比

  16. 16

    发送HTTP请求时,所有主流浏览器都使用主机头吗?

  17. 17

    发送HTTP请求时,所有主流浏览器都使用主机头吗?

  18. 18

    Ext.util.Observable.observe中的ExtJS调用控制器方法

  19. 19

    为 filterrific_observe_field 增加计时器的正确方法

  20. 20

    在什么情况下Array.observe的“添加”事件会触发?

  21. 21

    为什么`observe`和`observeEvent`在输入变量改变时表现不同?

  22. 22

    角度指令+ $ observe

  23. 23

    角度$ observe $ apply

  24. 24

    Cookies功能在除Chrome之外的所有主流浏览器中都能正常运行

  25. 25

    Cookies功能在除Chrome之外的所有主流浏览器中都能正常运行

  26. 26

    为什么({} + {})=“ [object Object] [object Object]”?

  27. 27

    Can't observe computed property

  28. 28

    Observe package from polymer dart

  29. 29

    并非所有Web浏览器都信任SSL证书。中级不工作?

热门标签

归档