设计目的

包含一些静态方法。设计这个API的目的:

  • Object中一些明显属于语言内部的方法(例如:Object.defineProperty),放到Reflect对象上
  • 修改一些方法的返回值的返回值让其更合理。例如当使用Object.defineProperty给对象添加属性时,如果不能添加,会抛出一个错误,但是Reflect.defineProperty会返回false
  • 将对Object的操作都变成函数行为。如 indelete变为 Reflect.hasReflect.deleteProperty
  • Reflect对象中的方法与Proxy handler中的方法一一对应,代表基础行为。例如:

    1. const obj = new Proxy({}, {
    2. get(target, key, reciver) {
    3. console.log('拦截成功');
    4. return Reflect.get(target, key, reciver)// 默认对target的取值行为
    5. }
    6. })

    方法

    Reflect对象一共有 13 个静态方法。

  • Reflect.apply(target, thisArg, args)。相当于Function.prototype.apply.call(target, thisArg, args)

  • Reflect.construct(target, args)
  • Reflect.get(target, name, receiver)
  • Reflect.set(target, name, value, receiver)
  • Reflect.defineProperty(target, name, desc)
  • Reflect.deleteProperty(target, name)
  • Reflect.has(target, name)
  • Reflect.ownKeys(target)
  • Reflect.isExtensible(target)。与Object.isExtensible对应,表示该对象是否可扩展(添加属性)
  • Reflect.preventExtensions(target)。与Object.preventExtensions对应,让对象变为不可扩展。
  • Reflect.getOwnPropertyDescriptor(target, name)
  • Reflect.getPrototypeOf(target)
  • Reflect.setPrototypeOf(target, prototype)

上面这些方法的作用,大部分与Object对象的同名方法的作用都是相同的,而且它与Proxy对象的方法是一一对应的。

应用场景

利用Proxy和Reflect实现一个观察者模式。

  1. class Observer{
  2. constructor(callback) {
  3. this.callback = callback;
  4. this.revokeList = [];
  5. }
  6. // 对target进行代理,当target修改属性时,触发callback
  7. observe(target) {
  8. let _that = this; // 保存ob实例
  9. if (target) {
  10. let p = Proxy.revocable(target, {
  11. set(target, key, val, receiver) {
  12. _that.callback(); // 调用回调
  13. return Reflect.set(target, key, val, receiver);
  14. }
  15. })
  16. this.revokeList.push(p.revoke);
  17. return p.proxy;
  18. }
  19. }
  20. revoke () {
  21. if (this.revokeList.length) {
  22. this.revokeList.forEach(item => {
  23. item();
  24. });
  25. return true; // return a true flag to make success
  26. } else {
  27. return false;
  28. }
  29. }
  30. } // 太拉了