Reflect对象简介

Reflect对象与Proxy对象一样,也是 ES6 为了操作对象而提供的新 API。Reflect对象的设计目的有这样几个。

(1) 将Object对象的一些明显属于语言内部的方法(比如Object.defineProperty),放到Reflect对象上。现阶段,某些方法同时在ObjectReflect对象上部署,未来的新方法将只部署在Reflect对象上。也就是说,从Reflect对象上可以拿到语言内部的方法。

(2) 修改某些Object方法的返回结果,让其变得更合理。比如,Object.defineProperty(obj, name, desc)在无法定义属性时,会抛出一个错误,而Reflect.defineProperty(obj, name, desc)则会返回false

  1. // 老写法
  2. try {
  3. Object.defineProperty(target, property, attributes);
  4. // success
  5. } catch (e) {
  6. // failure
  7. }
  8. // 新写法
  9. if (Reflect.defineProperty(target, property, attributes)) {
  10. // success
  11. } else {
  12. // failure
  13. }

(3) 让Object操作都变成函数行为。某些Object操作是命令式,比如name in objdelete obj[name],而Reflect.has(obj, name)Reflect.deleteProperty(obj, name)让它们变成了函数行为。

  1. // 老写法
  2. 'assign' in Object // true
  3. // 新写法
  4. Reflect.has(Object, 'assign') // true

(4)Reflect对象的方法与Proxy对象的方法一一对应,只要是Proxy对象的方法,就能在Reflect对象上找到对应的方法。这就让Proxy对象可以方便地调用对应的Reflect方法,完成默认行为,作为修改行为的基础。也就是说,不管Proxy怎么修改默认行为,你总可以在Reflect上获取默认行为。

  1. Proxy(target, {
  2. set: function(target, name, value, receiver) {
  3. var success = Reflect.set(target,name, value, receiver);
  4. if (success) {
  5. log('property ' + name + ' on ' + target + ' set to ' + value);
  6. }
  7. return success;
  8. }
  9. });

上面代码中,Proxy方法拦截target对象的属性赋值行为。它采用Reflect.set方法将值赋值给对象的属性,确保完成原有的行为,然后再部署额外的功能。

下面是另一个例子。

  1. var loggedObj = new Proxy(obj, {
  2. get(target, name) {
  3. console.log('get', target, name);
  4. return Reflect.get(target, name);
  5. },
  6. deleteProperty(target, name) {
  7. console.log('delete' + name);
  8. return Reflect.deleteProperty(target, name);
  9. },
  10. has(target, name) {
  11. console.log('has' + name);
  12. return Reflect.has(target, name);
  13. }
  14. });

上面代码中,每一个Proxy对象的拦截操作(getdeletehas),内部都调用对应的Reflect方法,保证原生行为能够正常执行。添加的工作,就是将每一个操作输出一行日志。

有了Reflect对象以后,很多操作会更易读。

  1. // 老写法
  2. Function.prototype.apply.call(Math.floor, undefined, [1.75]) // 1
  3. // 新写法
  4. Reflect.apply(Math.floor, undefined, [1.75]) // 1

es6 Reflect对象简介相关推荐

  1. es6 Reflect对象的静态方法

    Reflect对象的静态方法 Reflect对象一共有 13 个静态方法. Reflect.apply(target, thisArg, args) Reflect.construct(target, ...

  2. es6 Reflect对象详解

    Reflect是ES6为操作对象而提供的新API,而这个API设计的目的只要有: 将Object对象的一些属于语言内部的方法放到Reflect对象上,从Reflect上能拿到语言内部的方法.如:Obj ...

  3. ES6的Reflect对象

    Reflect对象的方法与Proxy对象的方法一一对应,只要proxy对象上有的方法reflect也能找到. ES6将Object对象的一些属于语言内部的方法放到Reflect对象上,从Reflect ...

  4. es6相关面试题:1.rest参数;2.new.target;3.object.defineProperty与Proxy的区别;4.Reflect对象作用;5.lterator迭代器;6.async

    文章目录 说说对ES6中rest参数的理解 说说你对new.target的理解 谈谈object.defineProperty与Proxy的区别 ES6中的Reflect对象有什么用? 简单介绍下ES ...

  5. es6利用Reflect实现观察者模式,并详解Reflect对象

    es6利用Reflect实现观察者模式,并详解Reflect对象 字面意思:反映;映出(影像) 先看一个简易的观察者模式: 上述观察者模式代码运行后输出: // 李四 20: // 哈哈 10: 分析 ...

  6. ES6中Reflect对象使用详解(附代码)

    目录 目录 Reflect的方法 Reflect.get(target, name, receiver) Reflect.set(target, name, value, receiver) Refl ...

  7. es6 --- Reflect的静态方法

    Reflect.get(target, name, receiver): 查找并返回 target对象的 name属性,若没有,返回undefined var myObject = {foo: 1,b ...

  8. Javascript Proxy对象 简介

    Javascript Proxy对象 简介 本文转载自:众成翻译 译者:eJayYoung 链接:http://www.zcfy.cc/article/4755 原文:https://blog.cam ...

  9. Js中Reflect对象

    Js中Reflect对象 Reflect是ES6起JavaScript内置的对象,提供拦截JavaScript操作的方法,这些方法与Proxy对象的handlers中的方法基本相同. 描述 Refle ...

最新文章

  1. 计算机房做法图集,万科建筑标准工程做法通用图集(全套)
  2. 初探云原生应用管理之:聊聊 Tekton 项目
  3. 问题 1044: [编程入门]三个字符串的排序
  4. “菜”鸟理解.NET Framework(CLI,CLS,CTS,CLR,FCL,BCL)
  5. k8s nodeSelector和affinity
  6. Java迭代器的一致_ArrayList中迭代器(Iterator)实现
  7. flutter中Image.network()网络图片加载失败使用默认图片显示
  8. python循环结构语句实现_Python的循环结构
  9. 科普:什么是权益证明?
  10. Dev C++ 英文模式改成中文模式
  11. 软件项目招投标中的“标的额”是什么意思?
  12. 泰山OFFICE技术讲座:宋体和Times New Roman字体的Tag表有哪些
  13. Linux下的硬件驱动——USB设备
  14. 文本串加密和解密程序。一个文本串可用事先给定的字母映射表进行加密
  15. 4种Java引用浅解
  16. 兄弟连IT教育-九年的发展!
  17. 写给自己,人生路远,勿忘初心
  18. C++没落了?学习C++没有前途了?从业者给你揭晓答案
  19. android锁屏快捷键设置,【Android高级】锁屏功能简单实现
  20. js html css淘宝足迹日历效果,JavaScript实现简单日历效果

热门文章

  1. 常见的mysql权限设置
  2. windows 内存管理的几种方式及其优缺点
  3. RHEL6入门系列之十七,打包与压缩
  4. 程序员的进阶课-架构师之路(12)-2-3-4树
  5. 怎样启用win7的超级管理员账户
  6. Android四级缓存,RecyclerView的四级缓存-初探
  7. C语言控制台应用程序绘制曲线,C语言控制台绘制曲线的实现代码
  8. [BZOJ] 1025 [SCOI2009]游戏
  9. git笔记(廖雪峰版本)
  10. 主从复制中忽略库的参数