@bornkiller
2014-12-11T22:47:36.000000Z
字数 1004
阅读 2280
javascript
关于双向绑定,在前端MV*框架中非常常见,比如谷歌出品的angularjs。而angular通过dirty-check实现,性能上存在明显瓶颈,需要大量变量监听时,性能掉的非常厉害。chrome 35之后引入Object.observe则可以很好的处理,而且之后会作为ES标准,无需担心通用性问题。
Object.observe()
Object.unobserve()
love = {};
function observer(changes) {
changes.forEach(function(change) {
console.log(change);
});
}
Object.observe(love, observer);
对象改变之后,就会调用observer,传递参数为数组,元素为变化描述对象。常规的变化描述对象结构为:
{
name: '',
type: '',
oldValue: '',
object: ''
}
name
表示值变化的键,type
表示变化类型,常用的有add
, update
, delete
,oldValue
表示变化前的值,object
可以理解为被监听的对象。
如果希望在值变化时立刻执行相关操作,或者需要额外的变化描述对象属性,就需要自己动手。
dark = {};
_darkKnight = '';
Object.defineProperty(dark, 'knight', {
get: function() {
return _darkKnight;
},
set: function(val) {
console.log('passed value is %s', val);
Object.getNotifier(this).notify({
format: 'access_log',
name: 'knight',
type: 'update',
oldValue: _darkKnight
});
_darkKnight = val;
}
});
Object.observe(dark, observer);
通过定义对象相应键的“访问器”,在变量变化时执行相关代码,然后使用notifier.notify()传递变化描述对象给observer,该对象此处可以有自定义字段。如果采取此种方式,必须显示调用notify()函数,否则observer无法得知键值变化。