ES6中Proxy代理用法实例浅析


Posted in Javascript onApril 06, 2017

本文实例讲述了ES6中Proxy代理用法。分享给大家供大家参考,具体如下:

ES6中提出了一个新的特性,就是proxy,用来拦截在一个对象上的指定操作。这个功能非常的有用。举一个例子来说:

var engineer = { name: 'Joe Sixpack', salary: 50 };
var interceptor = {
 set: function (receiver, property, value) {
  console.log(property, 'is changed to', value);
  receiver[property] = value;
 }
};
engineer = Proxy(engineer, interceptor);

engineer对象被代理Proxy构建的代理对象代替,传入Proxy的第二个参数是一个处理器函数,一个处理器函数有多种方法,如get、set等方法。这里的set方法能够拦截到那些在代理对象身上进行的所有的属性赋值操作。

当我们执行下面赋值:

engineer.salary = 60;

会触发处理器,输出信息:

salary is changed to 60

每当代理对象被赋值,处理器函数就会调用,这样就可以用来调试某些问题。

当然了,Proxy可不是仅仅为了调试而诞生的,如果你用过Sencha Touch 或者 AngularJS的话,就会发现这些框架都是类似数据模型绑定的功能。

笔者曾在Sencha Touch中用过代理,代码如下:

proxy:{//数据代理
//       type:'localstorage',
//       id:'bills',
    // limitParam:'limit',
    // pageParam:'page',
    //将用户代理改为sql,通过websql来解决localstorage的5MB存储上限的问题
    type:'sql',
    database:'myDB',
    table:'bill',
},
//filters:[{property:"kind",value:"无"}],//过滤属性
listeners:{
    removerecords:function(){
      console.log("数据被删除");
    },
    addrecords:function(){
      console.log("数据被追加");
    },
    updaterecord:function(){
      console.log("数据被修改");
    },
}

可以看到,它采用的是一种监听setter和getter的办法,而在Angular中采用的则是脏检测。。当我们有了Proxy后,对于简单的数据模型绑定就可以简化这些特定的检测方式了。

我们还可以使用proxy来实现多继承。众所周知,JavaScript中每个对象只能有一个直接的上层原型,从而无法实现多继承:

var foo = {
  foo: function () {
    console.log("foo")
  }
};
var bar = {
  bar: function () {
    console.log("bar")
  }
};
var sonOfFoo = Object.create(foo);
sonOfFoo.foo();   //"foo"
var sonOfBar = Object.create(bar);
sonOfBar.bar();   //"bar"
//怎么才能既有foo方法又有bar方法?

我们可以通过proxy中的get处理器来生成一个继承两个原型的代理对象:

sonOfFooBar = new Proxy({}, {
  get: function (target, name) {
    return target[name] || foo[name] || bar[name];
  }
})
sonOfFooBar.foo();  //"foo",有foo方法,继承自对象foo
sonOfFooBar.bar();  //"bar",也有bar方法,继承自对象bar

其还有很多应用场景,可以参考下面这篇文章:proxy

但是百度EFE团队给出的评价是该功能不能通过模拟实现,所以建议不要使用。所以还是值得观望一段时间的。

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

Javascript 相关文章推荐
关于this和self的使用说明
Aug 01 Javascript
100个不能错过的实用JS自定义函数
Mar 05 Javascript
jquery新的绑定事件机制on方法的使用方法
Apr 15 Javascript
通过jquery 获取URL参数并进行转码
Aug 18 Javascript
使用jQuery和Bootstrap实现多层、自适应模态窗口
Dec 22 Javascript
纯javaScript、jQuery实现个性化图片轮播【推荐】
Jan 08 Javascript
解决html-jquery/js引用外部图片时遇到看不了或出现403的问题
Sep 22 jQuery
JS实现将二维数组转为json格式字符串操作示例
Jul 12 Javascript
使用Easyui实现查询条件的后端传递并自动刷新表格的两种方法
Sep 09 Javascript
node.js使用http模块创建服务器和客户端完整示例
Feb 10 Javascript
JavaScript实现雪花飘落效果
Dec 27 Javascript
AudioContext 实现音频可视化(web技术分享)
Feb 24 Javascript
ES6中Symbol类型用法实例详解
Apr 06 #Javascript
vue中mint-ui环境搭建详细介绍
Apr 06 #Javascript
B/S(Web)实时通讯解决方案分享
Apr 06 #Javascript
HTML中使背景图片自适应浏览器大小实例详解
Apr 06 #Javascript
ES6中的箭头函数实例详解
Apr 06 #Javascript
ES6字符串模板,剩余参数,默认参数功能与用法示例
Apr 06 #Javascript
详谈js遍历集合(Array,Map,Set)
Apr 06 #Javascript
You might like
php存储过程调用实例代码
2013/02/03 PHP
PHP引用符&的用法详细解析
2013/08/22 PHP
PHP实现json_decode不转义中文的方法
2017/05/20 PHP
用javascript实现读取txt文档的脚本
2007/07/20 Javascript
JavaScript 应用技巧集合[推荐]
2009/08/30 Javascript
jquery实现的让超出显示范围外的导航自动固定屏幕最顶上
2011/09/22 Javascript
DOM 中的事件处理介绍
2012/01/18 Javascript
用js判断页面刷新或关闭的方法(onbeforeunload与onunload事件)
2012/06/22 Javascript
JavaScript 更严格的相等 [译]
2012/09/20 Javascript
玩转方法:call和apply
2014/05/08 Javascript
JavaScript获取网页、浏览器、屏幕高度和宽度汇总
2014/12/18 Javascript
JavaScript必知必会(五) eval 的使用
2016/06/08 Javascript
第一次接触神奇的Bootstrap网格系统
2016/07/27 Javascript
基于vue2的table分页组件实现方法
2017/03/20 Javascript
详解mpvue开发小程序小总结
2018/07/25 Javascript
Javascript格式化并高亮xml字符串的方法及注意事项
2018/08/13 Javascript
微信小程序收藏功能的实现代码
2020/06/19 Javascript
[53:52]OG vs EG 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
[43:43]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第三场 11.29
2020/12/02 DOTA
python利用hook技术破解https的实例代码
2013/03/25 Python
python实现将文本转换成语音的方法
2015/05/28 Python
Python判断文件和字符串编码类型的实例
2017/12/21 Python
python3个性签名设计实现代码
2018/06/19 Python
Python小白垃圾回收机制入门
2020/06/09 Python
带你学习Python如何实现回归树模型
2020/07/16 Python
Python3中FuzzyWuzzy库实例用法
2020/11/18 Python
HTML5 图片悬停放大的实现代码示例
2019/12/04 HTML / CSS
猫途鹰英国网站:TripAdvisor英国(旅游社区和旅游评论)
2016/08/30 全球购物
英国家喻户晓的家居商店:The Range
2019/03/25 全球购物
如何打印出当前源文件的文件名以及源文件的当前行号
2015/04/05 面试题
英文版银行求职信
2013/10/09 职场文书
十佳青年个人事迹材料
2014/01/28 职场文书
小学美术教学反思
2014/02/01 职场文书
中学教师教育感言
2014/02/21 职场文书
殡葬服务心得体会
2014/09/11 职场文书
如何使用vue3打造一个物料库
2021/05/08 Vue.js