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 相关文章推荐
ExtJs使用总结(非常详细)
Mar 22 Javascript
Jquery操作下拉框(DropDownList)实现取值赋值
Aug 13 Javascript
jquery实现textarea输入框限制字数的方法
Jan 15 Javascript
javascript组合使用构造函数模式和原型模式实例
Jun 04 Javascript
jQuery插件datalist实现很好看的input下拉列表
Jul 14 Javascript
jquery插件Jplayer使用方法简析
Apr 22 Javascript
使用jQuery加载html页面到指定的div实现方法
Jul 13 Javascript
JavaScript触发onScroll事件的函数节流详解
Dec 14 Javascript
jQuery ajax读取本地json文件的实例
Oct 31 jQuery
vue-cli3 从搭建到优化的详细步骤
Jan 20 Javascript
30分钟精通React今年最劲爆的新特性——React Hooks
Mar 11 Javascript
Vue混入mixins滚动触底的方法
Nov 22 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
用session做客户验证时的注意事项
2006/10/09 PHP
PHP 写文本日志实现代码
2010/05/18 PHP
PHP性能优化准备篇图解PEAR安装
2011/12/05 PHP
php实现改变图片直接打开为下载的方法
2015/04/14 PHP
滚动经典最新话题[prototype框架]下编写
2006/10/03 Javascript
从jQuery.camelCase()学习string.replace() 函数学习
2011/09/13 Javascript
JavaScript中instanceof与typeof运算符的用法及区别详细解析
2013/11/19 Javascript
jquery自动将form表单封装成json的具体实现
2014/03/17 Javascript
javascript模拟php函数in_array
2015/04/27 Javascript
异步JavaScript编程中的Promise使用方法
2015/07/28 Javascript
jQuery实现点击小图片淡入淡出显示大图片特效
2015/09/09 Javascript
再次谈论Javascript中的this
2016/06/23 Javascript
jQuery购物网页经典制作案例
2016/08/19 Javascript
jquery实现全选、全不选以及单选功能
2017/03/23 jQuery
jquery中$.fn和图片滚动效果实现的必备知识总结
2017/04/21 jQuery
highcharts 在angular中的使用示例代码
2017/09/20 Javascript
Angular.js实现获取验证码倒计时60秒按钮的简单方法
2017/10/18 Javascript
浅谈vue中改elementUI默认样式引发的static与assets的区别
2018/02/03 Javascript
解决layui中onchange失效以及form动态渲染失效的问题
2019/09/27 Javascript
vue基于v-charts封装双向条形图的实现代码
2019/12/09 Javascript
Vue封装Axios请求和拦截器的步骤
2020/09/16 Javascript
[41:56]Spirit vs Liquid Supermajor小组赛A组 BO3 第一场 6.2
2018/06/03 DOTA
对pandas的dataframe绘图并保存的实现方法
2017/08/05 Python
win10下Python3.6安装、配置以及pip安装包教程
2017/10/01 Python
Django ModelForm操作及验证方式
2020/03/30 Python
Python Selenium截图功能实现代码
2020/04/26 Python
法国发饰品牌:Alexandre De Paris
2018/12/04 全球购物
美国领先的宠物用品和宠物食品零售商:Petco
2020/10/28 全球购物
企业面试题试卷附带答案
2015/12/20 面试题
光电信息专业应届生求职信
2013/10/07 职场文书
小学生家长评语集锦
2014/01/30 职场文书
《美丽的黄昏》教学反思
2014/02/28 职场文书
初中军训感想300字
2014/03/05 职场文书
个人安全承诺书
2014/05/22 职场文书
2015大学生实训报告
2014/11/05 职场文书
CSS link与@import的区别和用法解析
2023/05/07 HTML / CSS