[关闭]
@bornkiller 2014-12-11T14:47:36.000000Z 字数 1004 阅读 2141

Chrome的新玩具---Object.observe

javascript


前言

关于双向绑定,在前端MV*框架中非常常见,比如谷歌出品的angularjs。而angular通过dirty-check实现,性能上存在明显瓶颈,需要大量变量监听时,性能掉的非常厉害。chrome 35之后引入Object.observe则可以很好的处理,而且之后会作为ES标准,无需担心通用性问题。

功用梳理

  1. love = {};
  2. function observer(changes) {
  3. changes.forEach(function(change) {
  4. console.log(change);
  5. });
  6. }
  7. Object.observe(love, observer);

对象改变之后,就会调用observer,传递参数为数组,元素为变化描述对象。常规的变化描述对象结构为:

  1. {
  2. name: '',
  3. type: '',
  4. oldValue: '',
  5. object: ''
  6. }

name表示值变化的键,type表示变化类型,常用的有add, update, deleteoldValue表示变化前的值,object可以理解为被监听的对象。

如果希望在值变化时立刻执行相关操作,或者需要额外的变化描述对象属性,就需要自己动手。

  1. dark = {};
  2. _darkKnight = '';
  3. Object.defineProperty(dark, 'knight', {
  4. get: function() {
  5. return _darkKnight;
  6. },
  7. set: function(val) {
  8. console.log('passed value is %s', val);
  9. Object.getNotifier(this).notify({
  10. format: 'access_log',
  11. name: 'knight',
  12. type: 'update',
  13. oldValue: _darkKnight
  14. });
  15. _darkKnight = val;
  16. }
  17. });
  18. Object.observe(dark, observer);

通过定义对象相应键的“访问器”,在变量变化时执行相关代码,然后使用notifier.notify()传递变化描述对象给observer,该对象此处可以有自定义字段。如果采取此种方式,必须显示调用notify()函数,否则observer无法得知键值变化。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注