使用 Proxy 寫一個觀察者模式的最簡單實現,即實現observable
和observe
這兩個函數。思路是observable
函數返回一個原始對象的 Proxy 代理,攔截賦值操作,觸發充當觀察者的各個函數。
const queuedObservers = new Set();
const observe = fn => queuedObservers.add(fn);
const observable = obj => new Proxy(obj, {set});
function set(target, key, value, receiver) {
const result = Reflect.set(target, key, value, receiver);
queuedObservers.forEach(observer => observer());
return result;
}
上面代碼中,先定義了一個Set
集合,所有觀察者函數都放進這個集合。然後,observable
函數返回原始對象的代理,攔截賦值操作。攔截函數set
之中,會自動執行所有觀察者。