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

(2) 修改某些 Object 方法的返回结果,让其变得更合理。比如,

Object.defineProperty(obj, name, desc)
// 在无法定义属性时,会抛出一个错误Reflect.defineProperty(obj, name, desc
// 在无法定义属性时,则会返回  false。
// 老写法
try {Object.defineProperty(target, property, attributes);// success
} catch (e) {// failure
}// 新写法
if (Reflect.defineProperty(target, property, attributes)) {// success
} else {// failure
}

(3) 让 Object 操作都变成函数行为。某些 Object 操作是命令式,让它们变成了函数行为。

name in obj
delete obj[name]Reflect.has(obj, name)
Reflect.deleteProperty(obj, name)
// 老写法
'assign' in Object // true// 新写法
Reflect.has(Object, 'assign') // true

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

Proxy(target, {set: function(target, name, value, receiver) {var success = Reflect.set(target, name, value, receiver);if (success) {console.log('property ' + name + ' on ' + target + ' set to ' + value);}return success;}
});

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

下面是另一个例子。

var loggedObj = new Proxy(obj, {get(target, name) {console.log('get', target, name);return Reflect.get(target, name);},deleteProperty(target, name) {console.log('delete' + name);return Reflect.deleteProperty(target, name);},has(target, name) {console.log('has' + name);return Reflect.has(target, name);}
});

Reflect对象的设计目的有这样几个相关推荐

  1. es6 Reflect对象简介

    Reflect对象简介 Reflect对象与Proxy对象一样,也是 ES6 为了操作对象而提供的新 API.Reflect对象的设计目的有这样几个. (1) 将Object对象的一些明显属于语言内部 ...

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

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

  3. Js中Reflect对象

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

  4. es6 Reflect对象详解

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

  5. 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 ...

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

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

  7. 实验2 Java类和对象的设计

    实验题目:Java类和对象的设计 一.上机目的和要求 理解面向对象的编程思想.类与对象的概念: 加深理解封装性.继承性和多态性: 掌握this.super.final.static等关键字的使用: 掌 ...

  8. 语言学与面对对象的设计

    本来打算把这篇文章的题目叫做使用语法分析进行面对对象的设计,但是写在这里的语法分析很容易使人(尤其是程序员)想到一种编程语言的语法,而不是我在这里所说得我们日常生活中所使用的语言中的语法(但是为了方便 ...

  9. Prism框架(一)——概述Prism框架的设计目的是用来帮助构建丰富、灵活、易维护的WPF和Si...

    Si Prism框架(一)--概述Prism框架的设计目的是用来帮助构建丰富.灵活.易维护的WPF和Si 提问者:mfksnr120(ID:187460) | 悬赏 0.0 希赛币 | 回答数:0 | ...

最新文章

  1. mysql query日期_如何获取mysql中两个日期之间的日期列表select query
  2. JavaScript设计模式--简单工厂模式例子---XHR工厂
  3. 【译】Linux概念架构的理解
  4. 爬虫+数据分析,制作一个世界疫情人数增长动态柱状竞赛图2
  5. vscode html如何插入模板?(!)
  6. 光流 | 光流算法对比:Farneback、Horn-Schunck、Lucas-Kanade、Lucas-Kanade derivative of Gaussian(附Matlab与C++代码)
  7. Java三元表达式学习笔记
  8. c#让电脑锁定、注销、关机
  9. github 公钥 私钥_windows下如何使用Git将本地项目上传到GitHub
  10. 在Visual Studio 2017中找不到.NET Framework 4.6.2
  11. python第一记,长江雨课堂抓包刷课实战
  12. MemTest和Memtest86+使用教程
  13. url的中文转码和解码
  14. 5G火车站来了!上海虹桥火车站5G网络建设正式启动...
  15. 《人工智能及其应用》重点回顾
  16. 手机号码归属地查询接口大全(七种)
  17. 雅虎终于死了:从市值 1000 亿到贱卖 48 亿,到最后连名字都没保住
  18. Micropython八位共阴数码管驱动模块分享
  19. 【Pyton安装】Python入门最详细的环境安装(附步骤),按照步骤点,几分钟就可以完成哦~
  20. 【题解】DZY Loves Math

热门文章

  1. 读取文件时,程序经历了什么?
  2. TensorFlow、PyTorch 之后,“国产”AI 框架还有没有机会?
  3. 太难了,斯坦福AI报告曝光!全球190万会AI,中国有5万
  4. 远程办公 4 大坑,坑坑“致命”!
  5. 享受梦幻技术盛宴,相约 Unite 2020
  6. 从 5G 到智能革命,这篇文章值得一看
  7. 前排强势围观|云端落地AI,如此超级干货有哪些?
  8. Oracle 痛裁程序员,阿里云坐收渔翁利?
  9. 对 5G “迟钝”的苹果,该如何后来居上?| 极客头条
  10. “不做信奥比赛,不做等级考试”的童心制物,是如何在 STEAM 教育突出重围?