标准的弃用方式: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 方法,占用空间非常小(
深度观察者: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'