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 相关文章推荐
一个js写的日历(代码部分网摘)
Sep 20 Javascript
给jQuery方法添加回调函数一款插件的应用
Jan 21 Javascript
JQuery 常用方法和事件详细介绍
Apr 18 Javascript
javascript制作的网页侧边弹出框思路及实现代码
May 21 Javascript
JQuery zClip插件实现复制页面内容到剪贴板
Nov 02 Javascript
AngularJS基础 ng-mousemove 指令简单示例
Aug 02 Javascript
详解angularjs结合pagination插件实现分页功能
Feb 10 Javascript
JS中利用swiper实现3d翻转幻灯片实例代码
Aug 25 Javascript
详解node.js中的npm和webpack配置方法
Jan 21 Javascript
jQuery实现带右侧索引功能的通讯录示例【附源码下载】
Apr 17 jQuery
JavaScript实现的DOM树遍历方法详解【二叉DOM树、多叉DOM树】
May 07 Javascript
微信小程序textarea层级过高(盖住其他元素)问题的解决办法
Mar 04 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
2019十大人气国漫
2020/03/13 国漫
PHP实现UTF-8文件BOM自动检测与移除实例
2014/11/05 PHP
php好代码风格的阶段性总结
2016/06/25 PHP
php str_getcsv把字符串解析为数组的实现方法
2017/04/05 PHP
JavaScript开发规范要求(规范化代码)
2010/08/16 Javascript
某页码显示的helper 少量调整,另附js版
2010/09/12 Javascript
基于jQuery的淡入淡出可自动切换的幻灯插件打包下载
2010/09/15 Javascript
IE不支持getElementsByClassName最终完美解决方案
2012/12/17 Javascript
解析js原生方法创建表格效率测试
2013/07/08 Javascript
jQuery的观察者模式详解
2014/12/22 Javascript
JavaScript中解析JSON数据的三种方法
2015/07/03 Javascript
使用原生js封装的ajax实例(兼容jsonp)
2017/10/12 Javascript
让bootstrap的carousel支持滑动滚屏的实现代码
2017/11/27 Javascript
vue实现裁切图片同时实现放大、缩小、旋转功能
2018/03/02 Javascript
解决Vue+Electron下Vuex的Dispatch没有效果问题
2019/05/20 Javascript
实用的 vue tags 创建缓存导航的过程实现
2020/12/03 Vue.js
Python安装Numpy和matplotlib的方法(推荐)
2017/11/02 Python
python爬取淘宝商品销量信息
2018/11/16 Python
Python3爬虫学习之应对网站反爬虫机制的方法分析
2018/12/12 Python
Python实现二叉搜索树BST的方法示例
2019/07/30 Python
Python使用Beautiful Soup爬取豆瓣音乐排行榜过程解析
2019/08/15 Python
浅析使用Python搭建http服务器
2019/10/27 Python
Python3基于plotly模块保存图片表格
2020/08/03 Python
用python获取txt文件中关键字的数量
2020/12/24 Python
js实现移动端H5页面手指滑动刻度尺功能
2017/11/16 HTML / CSS
联想美国官方商城:Lenovo美国
2017/06/19 全球购物
Bibloo奥地利:购买女装、男装、童装、鞋和配件
2018/10/18 全球购物
C#笔试题集合
2013/06/21 面试题
2014自荐信的写作技巧
2014/01/28 职场文书
2014学雷锋活动总结
2014/03/09 职场文书
自行车广告词大全
2014/03/21 职场文书
《蚕姑娘》教学反思
2014/04/15 职场文书
个人查摆问题自查报告
2014/10/16 职场文书
政风行风评议心得体会
2014/10/21 职场文书
企业培训简报范文
2015/07/20 职场文书
个人道歉信大全
2019/04/11 职场文书