mirror of
https://github.com/ruanyf/es6tutorial.git
synced 2024-04-21 12:32:22 +00:00
docs(proxy): add proxy 实现观察者模式
This commit is contained in:
@@ -1036,3 +1036,43 @@ Reflect.defineProperty(obj, name, desc);
|
||||
```
|
||||
|
||||
上面代码中,`Reflect.defineProperty`方法的作用与`Object.defineProperty`是一样的,都是为对象定义一个属性。但是,`Reflect.defineProperty`方法失败时,不会抛出错误,只会返回`false`。
|
||||
|
||||
## 实例:使用 Proxy 实现观察者模式
|
||||
|
||||
观察者模式(Observer mode)指的是函数自动观察数据对象,一旦对象有变化,函数就会自动执行。
|
||||
|
||||
```javascript
|
||||
const person = observable({
|
||||
name: '张三',
|
||||
age: 20
|
||||
});
|
||||
|
||||
function print() {
|
||||
console.log(`${person.name}, ${person.age}`)
|
||||
}
|
||||
|
||||
observe(print);
|
||||
person.name = '李四';
|
||||
// 输出
|
||||
// 李四, 20
|
||||
```
|
||||
|
||||
上面代码中,数据对象`person`是观察目标,函数`print`是观察者。一旦数据对象发生变化,`print`就会自动执行。
|
||||
|
||||
下面,使用 Proxy 写一个观察者模式的最简单实现,即实现`observable`和`observe`这两个函数。思路是`observable`函数返回一个原始对象的 Proxy 代理,拦截赋值操作,触发充当观察者的各个函数。
|
||||
|
||||
```javascript
|
||||
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`之中,会自动执行所有观察者。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user