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 相关文章推荐
判断一个对象是否为jquery对象的方法
Mar 12 Javascript
从零学JS之你需要了解的几本书
May 19 Javascript
javascript圆盘抽奖程序实现原理和完整代码例子
Jun 03 Javascript
javascript创建对象、对象继承的实用方式详解
Mar 08 Javascript
javascript移动开发中touch触摸事件详解
Mar 18 Javascript
URL的参数中有加号传值变为空格的问题(URL特殊字符)
Nov 04 Javascript
node中koa中间件机制详解
Aug 22 Javascript
JS插件clipboard.js实现一键复制粘贴功能
Dec 04 Javascript
解决vue动态为数据添加新属性遇到的问题
Sep 18 Javascript
Vue入门之数量加减运算操作示例
Dec 11 Javascript
Vue移动端右滑屏幕返回上一页附源码下载
Jun 26 Javascript
vue组件命名和props命名代码详解
Sep 01 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 smarty truncate UTF8乱码问题解决办法
2014/06/13 PHP
实例详解PHP中html word 互转的方法
2016/01/28 PHP
php时间函数用法分析
2016/05/28 PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
2017/11/14 PHP
php测试kafka项目示例
2020/02/06 PHP
简短几句 通俗解释javascript的闭包
2011/01/17 Javascript
jquery 操作DOM案例代码分享
2012/04/05 Javascript
到处都是jQuery选择器的年代 不了解它们的性能,行吗
2012/06/18 Javascript
js实现页面转发功能示例代码
2013/08/05 Javascript
js 判断js函数、变量是否存在的简单示例代码
2014/03/04 Javascript
ext combobox动态加载数据库数据(附前后台)
2014/06/17 Javascript
JS运动框架之分享侧边栏动画实例
2015/03/03 Javascript
JS实现随机乱撞彩色圆球特效的方法
2015/05/05 Javascript
JS实现的自定义水平滚动字体插件完整实例
2016/06/17 Javascript
jqGrid翻页时数据选中丢失问题的解决办法
2017/02/13 Javascript
鼠标拖动改变DIV等网页元素的大小的实现方法
2017/07/06 Javascript
vue 监听键盘回车事件详解 @keyup.enter || @keyup.enter.native
2018/08/25 Javascript
详解微信小程序实现跑马灯效果(附完整代码)
2019/04/29 Javascript
小程序云函数调用API接口的方法
2019/05/17 Javascript
jQuery实现消息弹出框效果
2019/12/10 jQuery
解决vue无法侦听数组及对象属性的变化问题
2020/07/17 Javascript
jQuery+ThinkPHP实现图片上传
2020/07/23 jQuery
解决vue的router组件component在import时不能使用变量问题
2020/07/26 Javascript
解决element-ui的下拉框有值却无法选中的情况
2020/11/07 Javascript
python通过exifread模块获得图片exif信息的方法
2015/03/16 Python
Python复制文件操作实例详解
2015/11/10 Python
详解Django之auth模块(用户认证)
2018/04/17 Python
Linux下python3.6.1环境配置教程
2018/09/26 Python
pytorch学习教程之自定义数据集
2020/11/10 Python
使用 css3 transform 属性来变换背景图的方法
2019/05/07 HTML / CSS
Ralph Lauren英国官方网站:Ralph Lauren UK
2018/04/03 全球购物
Linux如何修改文件和文件夹的权限
2012/06/27 面试题
电力公司个人求职信范文
2014/02/04 职场文书
二年级上册数学教学计划
2015/01/20 职场文书
兼职安全员岗位职责
2015/02/15 职场文书
感恩教师节主题班会
2015/08/12 职场文书