ES6知识点整理之Proxy的应用实例详解


Posted in Javascript onApril 16, 2019

本文实例讲述了ES6知识点整理之Proxy的应用。分享给大家供大家参考,具体如下:

Proxy 用于修改对象某些操作的默认行为,可以对外界的访问进行过滤和改写,其概念类似于元编程。

Proxy 让我们可以对任何对象的绝大部分行为进行监听和干涉,实现更多的自定义程序行为。在目标对象之前架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截。

目前【兼容性】存在一定的问题,目前在chrome和ff浏览器中的非严格模式下可用,一些先进的技术即使在目前不能广泛应用,但随着时间的流逝,都将会进入程序员日常的编程中。

注: 博客整理时间:2018-03-24 16:21:15

初识Proxy

var obj = {name:'Joh'};
var proxy = new Proxy(obj, {
 get (target, key) {
  return 'test1';
 },
 set (target, key, value) {
  target[key] = value
 }
});
console.log(proxy.name); // test1 进行get取值
proxy.name = 'test2'; // 进行set设置
console.log(obj.name); // test2

通过Proxy对象进行拦截target对象的属性

完整的使用Proxy进行设置, 获取,修改和删除的案例

var obj = {name:'Joh',group:'g1',_type:'student'};
var proxy = new Proxy(obj, {
 get (target, key) {
  if(key[0]!== '_') {
   // return Reflect.get(target,key); // 效果等同于下面的return语句
   return target[key];
  };
 },
 set (target, key, value) {
  if(key[0]!== '_') {
   // Reflect.set(target,key,value);
   return target[key] = value;
  }
 },
 deleteProperty(target, key) {
  // 业务逻辑
  if(key[0] !== '_') {
   // Reflect.deleteProperty(target, key);
   delete target[key];
  }
 }
});
console.log(proxy.name); // Joh
console.log(obj.name); // Joh
proxy.name = 'Lily'; // 在非严格模式下的赋值操作,严格模式将会报错
console.log(obj.name); // Lily
delete proxy.name; // 未能成功删除,因为上面内部有判断
console.log(obj.name); // undefined 成功删除
delete proxy.group;
console.log(obj.group); // undefined 成功删除
delete proxy._type;
console.log(obj._type); // student
proxy.color='red';
console.log(obj.color); // red

其中借助Reflect实现和直接实现的效果等同

通过has方法和in关键字进行拦截的示例:

var obj = {name:"Joh",_name:"Lily"};
var proxy = new Proxy(obj, {
 has(target, key) {
  if(key[0] === '_'){
   return false;
  } else {
   return key in target;
  }
 }
});
console.log('has name attr: ', 'name' in proxy); // has name attr: true
console.log('has _name attr: ', '_name' in proxy); // has _name attr: false

使用ownKeys方法与for-in遍历过滤符合特定规则属性的示例

var obj = {name:"Joh",_name:"Lily", age:10, group:"g1"};
var proxy = new Proxy(obj, {
 ownKeys (target) {
  return Reflect.ownKeys(target).filter(key => key[0] !== '_');
 }
});
for(var k in proxy) {
 console.log(k); // 分别输出 name age group 过滤了 _name
}

通过apply方法对函数调用的拦截

function test() {
 console.log('hello world');
}
var proxyFun = new Proxy(test,{
 apply(target,ctx,args) {
  console.log('proxy apply');
  return Reflect.apply(target,ctx,args);
 }
});
proxyFun(); // 分别输出 proxy apply 和 hello world
// proxyFun.apply(); // 同样,分别输出 proxy apply 和 hello world
// proxyFun.call(); // 同样,分别输出 proxy apply 和 hello world

通过construct方法对构造函数实例化的拦截

function User() {
 console.log('this is a contructor');
}
var ClassProxy = new Proxy(User, {
 construct(target,args) {
  console.log('proxy construct');
  return Reflect.construct(target,args);
 }
});
new ClassProxy(); // 分别输出 proxy construct 和 this is a contructor

更多关于JavaScript相关内容可查看本站专题:《javascript面向对象入门教程》、《JavaScript切换特效与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

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

Javascript 相关文章推荐
Draggable Elements 元素拖拽功能实现代码
Mar 30 Javascript
使用iframe window的scroll方法控制iframe页面滚动
Mar 05 Javascript
详细分析JavaScript函数定义
Jul 16 Javascript
JavaScript实现点击按钮字体放大、缩小
Feb 29 Javascript
Ext JS框架中日期函数的用法及日期选择控件的实现
May 21 Javascript
JS图片等比例缩放方法完整示例
Aug 03 Javascript
jQuery设置和获取select、checkbox、radio的选中值方法
Jan 01 Javascript
原生JS实现N级菜单的代码
May 21 Javascript
基于three.js编写的一个项目类示例代码
Jan 05 Javascript
Layui数据表格判断编辑输入的值,是否为我需要的类型详解
Oct 26 Javascript
基于JS实现视频上传显示进度条
May 12 Javascript
ant design charts 获取后端接口数据展示
May 25 Javascript
js实现删除li标签一行内容
Apr 16 #Javascript
js实现弹出框的拖拽效果实例代码详解
Apr 16 #Javascript
重学 JS:为啥 await 不能用在 forEach 中详解
Apr 15 #Javascript
你不知道的Vue技巧之--开发一个可以通过方法调用的组件(推荐)
Apr 15 #Javascript
详解JavaScript中的强制类型转换
Apr 15 #Javascript
一个小时快速搭建微信小程序的方法步骤
Apr 15 #Javascript
详解从0开始搭建微信小程序(前后端)的全过程
Apr 15 #Javascript
You might like
php数据结构与算法(PHP描述) 查找与二分法查找
2012/06/21 PHP
PHP5.3的垃圾回收机制(动态存储分配方案)深入理解
2012/12/10 PHP
ThinkPHP入口文件设置及相关注意事项分析
2014/12/05 PHP
php结合md5的加密解密算法实例
2016/09/30 PHP
PHP实现微信退款的方法示例
2019/03/26 PHP
常见浏览器多长时间会提示“脚本运行时间过长”总结
2014/04/29 Javascript
JavaScript中property和attribute的区别详细介绍
2015/03/03 Javascript
jQuery左右滚动支持图片放大缩略图图片轮播代码分享
2015/08/26 Javascript
jQuery实现可展开合拢的手风琴面板菜单
2015/09/15 Javascript
三种Node.js写文件的方式
2016/03/08 Javascript
下一代Bootstrap的5个特点 超酷炫!
2016/06/17 Javascript
文件上传,iframe跨域数据提交的实现
2016/11/18 Javascript
vue组件watch属性实例讲解
2017/11/07 Javascript
深入浅析Vue中的Prop
2018/06/10 Javascript
vue3.0 CLI - 2.1 -  component 组件入门教程
2018/09/14 Javascript
详解Node.js中path模块的resolve()和join()方法的区别
2018/10/29 Javascript
jQuery实现合并表格单元格中相同行操作示例
2019/01/28 jQuery
JS如何实现网站中PC端和手机端自动识别并跳转对应的代码
2020/01/08 Javascript
微信小程序开发之获取用户手机号码(php接口解密)
2020/05/17 Javascript
python目录操作之python遍历文件夹后将结果存储为xml
2014/01/27 Python
windows下python模拟鼠标点击和键盘输示例
2014/02/28 Python
完美解决在oj中Python的循环输入问题
2018/06/25 Python
用Python实现数据的透视表的方法
2018/11/16 Python
CSS3 优势以及网页设计师如何使用CSS3技术
2009/07/29 HTML / CSS
荷兰包包购物网站:The Little Green Bag
2018/03/17 全球购物
德国汽车零件和汽车配件网上商店:kfzteile24
2018/11/14 全球购物
Java中实现多态的机制
2015/08/09 面试题
土木工程毕业生推荐信
2013/10/28 职场文书
管理学专业个人求职信范文
2013/12/13 职场文书
运动会开幕式邀请函
2014/01/22 职场文书
出生证明公证书
2014/04/09 职场文书
银行党的群众路线教育实践活动对照检查材料
2014/09/25 职场文书
业务员辞职信范文
2015/03/02 职场文书
报案材料怎么写
2015/05/25 职场文书
PyQt5 QThread倒计时功能的实现代码
2021/04/02 Python
pytorch 一行代码查看网络参数总量的实现
2021/05/12 Python