标准的弃用方式:Object.observe()
Object.observe() 方法用于异步观察对象的变化。它按发生的顺序提供了一系列变化。但是,此 API 已被弃用并从浏览器中删除。
let myObservdObject = Object.observe( { a : 'foo' }, e=>console.log('change!', e) );
myObservdObject.a = 'bee';
// callback gets executed
// and prints 'changed! in console, with the change event data
但是代理到达标准(ES6)时,Object.Observe 已被弃用,并且浏览器也不支持。
代理是观察的新方式……但与 Object.observe 过去提供给我们的方式相比,实现通用观察者需要更复杂的实现。
观察第三方库的价值变化
您可以找到许多基于代理的实现。其中一些实现了观察者模式,这迫使您使用特定方法设置或获取值:
观察:
https ://www.npmjs.com/package/observe
// define your object
var object = {a:'bee'};
// generate an observer
var observer = observe(object);
// declare the onchange event handler
observer.on( 'change', change=> console.log(change) );
// ready!
// set the value of 'a' and see how the callback is executed...
observer.set('a', 'foo')
// get the new value
observer.get('a') // returns 'foo'
相反,其他库允许您使用更自然的方式与变量交互:
WatchJS:
https ://github.com/melanke/Watch.JS/
// define your object
var object = {a:'bee'};
// generate an observer and declare de hadler
watch(object , "a" , e=>console.log(e) );
// ready!
// set the value of 'a' and see how the callback is executed...
object.a = 'foo';
// get the new value
object.a // returns 'foo'
我自己的方法:深度观察者
所有的实施都有自己的警告,没有一个适合我的目的,所以我必须实施我自己的方法。
结果是一个高度可定制的 Observer 方法,占用空间非常小(压缩后 <100 字节)
深度观察者:https ://www.npmjs.com/package/deep-observer
// create an observable object
const myObserved = new Observer( { a : 'bee' } , e=>console.log(e) ),
// perform a modification
myObserved.a = 'foo';
// console : { action:'update', oldValue:'bee', object:{a:'foo'}, name:'a' }
myObserved.a; // returns 'foo'