ES6 proxy和reflect的使用方法与应用实例分析


Posted in Javascript onFebruary 15, 2020

本文实例讲述了ES6 proxy和reflect的使用方法。分享给大家供大家参考,具体如下:

proxy和reflect都是es6为了更好的操作对象而提供的新的API,接下来探讨一下二者的作用,联系。

设计proxy,reflect的作用:

proxy的作用:

Proxy的设计目的在于(修改编程语言),修改某些操作方法的默认行为,

等同于在语言层面作出修改,是元编程(meta programming)  例如修改set,get方法

reflect的作用:

1,映射一些明显属于对象语言内部的方法,目前是共存于Object和Reflect上,未来只在Reflect上

2,修改一些Object上的方法返回的结果,减少异常抛出,使其变得更加合理

3,让Object操作都变成函数行为(主要的作用)

4,Reflect对象的方法与Proxy对象的方法一一对应(主要的作用)

proxy和reflect的方法:

proxy的实例方法:

get() set() apply() has() cunstruct() deleteProperty() defineProperty()
getOwnPropertyDescriptor() getPrototypeOf() isExtensible() ownKeys(), preventExtensions() setPrototypeOf()  
var person = {
 name: "张三"
};
 
var proxy = new Proxy(person, {
 get: function(target, property) {
  if (property in target) {
   return target[property];
  } else {
   throw new ReferenceError("Property \"" + property + "\" does not exist.");
  }
 }
});

注:目标对象内部的this关键字会指向 Proxy 代理

自身方法:Proxy.revocable方法返回一个可取消的 Proxy 实例

reflect的静态方法:

和proxy相对应,reflect有13个静态方法,分别一一对应于proxy的实例方法

Reflect.apply(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) Reflect.preventExtensions(target)
Reflect.getOwnPropertyDescriptor(target, name) Reflect.getPrototypeOf(target)
Reflect.setPrototypeOf(target, prototype)  

proxy和reflect联系:proxy的实例方法和reflect的静态方法一一对应

实例:观察者模式的实现

const queuedObservers = new Set();
 
const observe = fn => queuedObservers.add(fn);//接收一个函数fn
const observable = obj => new Proxy(obj, {set});//接收一个对象obj,采用set函数拦截设置obj
 
function set(target, key, value, receiver) {
 const result = Reflect.set(target, key, value, receiver);
 queuedObservers.forEach(observer => observer());
 return result;
}

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

更多关于JavaScript相关内容可查看本站专题:《JavaScript操作DOM技巧总结》、《JavaScript页面元素操作技巧总结》、《JavaScript事件相关操作与技巧大全》、《JavaScript查找算法技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript错误与调试技巧总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
JQuery从头学起第二讲
Jul 04 Javascript
JS获取地址栏参数的小例子
Aug 23 Javascript
JQuery文字列表向上滚动的代码
Nov 13 Javascript
JavaScript中的typeof操作符用法实例
Apr 05 Javascript
JavaScript动态设置div的样式的方法
Dec 26 Javascript
vue组件中使用iframe元素的示例代码
Dec 13 Javascript
vue项目中导入swiper插件的方法
Jan 30 Javascript
vue中进入详情页记住滚动位置的方法(keep-alive)
Sep 21 Javascript
解析原来浏览器原生支持JS Base64编码解码
Aug 12 Javascript
Node.js系列之发起get/post请求(2)
Aug 30 Javascript
Vue 实现对quill-editor组件中的工具栏添加title
Aug 03 Javascript
vue-cli3自动消除console.log()的调试信息方式
Oct 21 Javascript
js表达式与运算符简单操作示例
Feb 15 #Javascript
ES6 class类链式继承,实例化及react super(props)原理详解
Feb 15 #Javascript
ES6 Iterator遍历器原理,应用场景及相关常用知识拓展详解
Feb 15 #Javascript
es6 super关键字的理解与应用实例分析
Feb 15 #Javascript
es6中class类静态方法,静态属性,实例属性,实例方法的理解与应用分析
Feb 15 #Javascript
Vue父子传递实例讲解
Feb 14 #Javascript
Javascript操作select控件代码实例
Feb 14 #Javascript
You might like
thinkphp中连接oracle时封装方法无法用的解决办法
2013/06/17 PHP
php读取3389的脚本
2014/05/06 PHP
PHP基于工厂模式实现的计算器实例
2015/07/16 PHP
php中pcntl_fork创建子进程的方法实例
2019/03/14 PHP
浅析PHP7 的垃圾回收机制
2019/09/06 PHP
关于setInterval、setTimeout在jQuery中的使用注意事项
2011/09/28 Javascript
javascript函数重载解决方案分享
2014/02/19 Javascript
基于bootstrap3和jquery的分页插件
2015/07/31 Javascript
JS基于Ajax实现的网页Loading效果代码
2015/10/27 Javascript
jquery获取文档高度和窗口高度汇总
2016/01/25 Javascript
JS中如何比较两个Json对象是否相等实例代码
2016/07/13 Javascript
Vuejs第九篇之组件作用域及props数据传递实例详解
2016/09/05 Javascript
JS中解决谷歌浏览器记住密码输入框颜色改变功能
2017/02/13 Javascript
Vue2.0实现将页面中表格数据导出excel的实例
2017/08/09 Javascript
qrcode生成二维码微信长按无法识别问题的解决
2019/04/04 Javascript
基于JavaScript判断两个对象内容是否相等
2020/01/10 Javascript
Python使用自带的ConfigParser模块读写ini配置文件
2016/06/26 Python
pygame 精灵的行走及二段跳的实现方法(必看篇)
2017/07/10 Python
Odoo中如何生成唯一不重复的序列号详解
2018/02/10 Python
python-itchat 获取微信群用户信息的实例
2019/02/21 Python
python版DDOS攻击脚本
2019/06/12 Python
利用setuptools打包python程序的方法步骤
2020/01/18 Python
Python网页解析器使用实例详解
2020/05/30 Python
python Matplotlib基础--如何添加文本和标注
2021/01/26 Python
澳大利亚冒险体验:Adrenaline(跳伞、V8赛车、热气球等)
2017/09/18 全球购物
荷兰皇家航空公司官方网站:KLM Royal Dutch Airlines
2017/12/07 全球购物
美国婚礼装饰和活动用品批发供应商:Event Decor Direct
2018/10/12 全球购物
EM Cosmetics官网:由彩妆大神Michelle Phan创办的独立品牌
2020/04/27 全球购物
如何处理简单的PHP错误
2015/10/14 面试题
日语翻译个人求职的自我评价
2013/10/14 职场文书
聘用意向书
2014/07/29 职场文书
2015年元旦主持词结束语
2014/12/14 职场文书
给老婆的检讨书(搞笑版)
2015/05/06 职场文书
2015年酒店年度工作总结
2015/05/23 职场文书
家电创业计划书
2019/08/05 职场文书
动视暴雪取消疫苗禁令 让所有员工返回线下工作
2022/04/03 其他游戏