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 相关文章推荐
javascript 字符串连接的性能问题(多浏览器)
Nov 18 Javascript
javascript算法题 求任意一个1-9位不重复的N位数在该组合中的大小排列序号
Jul 21 Javascript
浅谈JavaScript中的字符编码转换问题
Jul 07 Javascript
基于jQuery实现Ajax验证用户名是否存在实例
Mar 30 Javascript
js判断主流浏览器类型和版本号的简单实现代码
May 26 Javascript
jq实现左滑显示删除按钮,点击删除实现删除数据功能(推荐)
Aug 23 Javascript
javascript 将共享属性迁移到原型中去的实现方法
Aug 31 Javascript
Vue 全局loading组件实例详解
May 29 Javascript
简述ES6新增关键字let与var的区别
Aug 23 Javascript
使用JS location实现搜索框历史记录功能
Dec 23 Javascript
JavaScript实现PC端横向轮播图
Feb 07 Javascript
jQuery 常用特效实例小结【显示与隐藏、淡入淡出、滑动、动画等】
May 19 jQuery
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
如何去掉文章里的 html 语法
2006/10/09 PHP
PHP面向对象分析设计的61条军规小结
2010/07/17 PHP
zend api扩展的php对象的autoload工具
2011/04/18 PHP
Yii入门教程之目录结构、入口文件及路由设置
2014/11/25 PHP
thinkphp框架实现删除和批量删除
2016/06/29 PHP
PHP后期静态绑定实例浅析
2018/12/21 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
ExtJS Window 最小化的一种方法
2009/11/18 Javascript
jQuery随便控制任意div隐藏的方法
2013/06/28 Javascript
js导出格式化的excel 实例方法
2013/07/17 Javascript
JavaScript 实现打印,打印预览,打印设置
2014/12/30 Javascript
javascript动态修改Li节点值的方法
2015/01/20 Javascript
js实现上传图片预览的方法
2015/02/09 Javascript
JavaScript鼠标事件,点击鼠标右键,弹出div的简单实例
2016/08/03 Javascript
修改UA在PC中访问只能在微信中打开的链接方法
2017/11/27 Javascript
Vue 中使用富文本编译器wangEditor3的方法
2019/09/26 Javascript
vue2.x 对象劫持的原理实现
2020/04/19 Javascript
如何在vue中使用jointjs过程解析
2020/05/29 Javascript
[02:39]DOTA2国际邀请赛助威团西雅图第一天
2013/08/08 DOTA
Python中使用装饰器和元编程实现结构体类实例
2015/01/28 Python
Python实现基于C/S架构的聊天室功能详解
2018/07/07 Python
flask利用flask-wtf验证上传的文件的方法
2020/01/17 Python
在ipython notebook中使用argparse方式
2020/04/20 Python
python实现扑克牌交互式界面发牌程序
2020/04/22 Python
django 数据库返回queryset实现封装为字典
2020/05/19 Python
python函数超时自动退出的实操方法
2020/12/28 Python
十佳大学生村官事迹
2014/01/09 职场文书
股份转让协议书
2014/04/12 职场文书
促销活动总结
2014/04/28 职场文书
社团活动总结书
2014/06/27 职场文书
党支部对照检查材料
2014/08/25 职场文书
民主评议党员总结
2014/10/20 职场文书
初中中等生评语
2014/12/29 职场文书
2015年党小组工作总结
2015/05/26 职场文书
关于做家务的心得体会
2016/01/23 职场文书
分享CSS盒子模型隐藏的几种方式
2022/02/28 HTML / CSS