ChuChencheng / note

菜鸡零碎知识笔记
Creative Commons Zero v1.0 Universal
3 stars 0 forks source link

ES6 Reflect #25

Open ChuChencheng opened 4 years ago

ChuChencheng commented 4 years ago

概念

Reflect 是一个内置的对象,提供拦截操作的方法,与 Proxy 的 handlers 方法相同。

可以配合 Proxy 使用,在 handlers 中通过 Reflect 获取默认行为,在完成默认行为的基础上做修改。

静态方法

与 Proxy handlers 相同的 13 个方法。

应用

使用 Proxy 实现观察者模式:

/** 观察者集合 */
const observerSet = new Set()

// 观察者模式方法
const observe = (fn) => observerSet.add(fn)
const observable = (obj) => new Proxy(obj, { set })
const set = (target, key, value, receiver) => {
  // 先完成默认行为
  const result = Reflect.set(target, key, value, receiver)
  // 通知观察者变化
  observerSet.forEach((observer) => observer())
  return result
}

/** 观察目标 */
const person = observable({
  name: 'a',
  age: 18,
})

/** 观察者 */
const print = () => {
  console.log(`${person.name}, ${person.age}`)
}

observe(print)

person.name = 'b' // b 18

参考

http://es6.ruanyifeng.com/#docs/reflect