Skip to content

Reflect 是一个内置的 JS 对象,它提供了一系列方法,开发者可以调用这些方法访问 JS 的一些底层功能。

由于这是 JS 在 ES 6 中新提供的功能,如果要兼容旧版本浏览器,只有去模拟实现,且模拟出来的效果还不完全一样,所以这里其实有兼容性问题。

这个东西类似于其他语言中的反射,所以取名为 Reflect

Reflect 可以完成下面的功能

  • 属性的赋值
  • 属性的取值
  • 调用普通函数
  • 调用构造函数
  • 判断属性是否存在于对象中
  • 等等

这里有一个问题,以上的这些功能,是我们刚学习 JS 的时候就接触到的功能,既然这些功能本身就是 JS 中很基础的知识,为什么这里还要使用 Reflect 重新实现一次呢?

实际上这是 ES 的设计理念,这个理念在 ES 5 就被提出,那就是减少魔法,让代码更纯粹。这一理念其实是收到函数式编程的影响,ES 6 贯彻这一理念,认为对属性内存的控制,原型链的修改,函数调用等等都属于 JS 的底层实现,对用户不透明,这种底层实现应该是越少越好,都应该把它提取出来形成一个正常 API,并聚合到某一个对象中去,这就是 Reflect 对象。

我们可以在:Reflect - JavaScript | MDN 中看到 Reflect 中所有的方法,这里罗列一些

  • Reflect.set(target, propertyKey, value): 设置对象target的属性propertyKey的值为value,等同于给对象的属性赋值
  • Reflect.get(target, propertyKey): 读取对象target的属性propertyKey,等同于读取对象的属性值
  • Reflect.apply(target, thisArgument, argumentsList):调用一个指定的函数,并绑定this和参数列表。等同于函数调用
  • Reflect.deleteProperty(target, propertyKey):删除一个对象的属性
  • Reflect.defineProperty(target, propertyKey, attributes):类似于Object.defineProperty,不同的是如果配置出现问题,返回false而不是报错
  • Reflect.construct(target, argumentsList):用构造函数的方式创建一个对象
  • Reflect.has(target, propertyKey): 判断一个对象是否拥有一个属性

以笔记为镜,可以知得失