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 相关文章推荐
TextArea不支持maxlength的解决办法(jquery)
Sep 13 Javascript
深入理解Javascript中的循环优化
Nov 09 Javascript
JavaScript日期时间格式化函数分享
May 05 Javascript
jQuery实现自动滚动到页面顶端的方法
May 22 Javascript
体验jQuery和AngularJS的不同点及AngularJS的迷人之处
Feb 02 Javascript
JavaScript实现购物车基本功能
Jul 21 Javascript
thinkjs 文件上传功能实例代码
Nov 08 Javascript
Vuex 使用及简单实例(计数器)
Aug 29 Javascript
Vue-Router基础学习笔记(小结)
Oct 15 Javascript
JavaScript实现秒杀时钟倒计时
Sep 29 Javascript
微信小程序实现页面左右滑动
Nov 16 Javascript
JavaScript 中的六种循环方法
Jan 06 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实现框架(二)
2006/10/09 PHP
PHP提取数据库内容中的图片地址并循环输出
2010/03/21 PHP
使用XDebug调试及单元测试覆盖率分析
2011/01/27 PHP
PHP中读取照片exif信息的方法
2014/08/20 PHP
CI框架验证码CAPTCHA辅助函数用法实例
2014/11/05 PHP
PHP面向对象程序设计组合模式与装饰模式详解
2016/12/02 PHP
Thinkphp极验滑动验证码实现步骤解析
2020/11/24 PHP
Jquery实现三层遍历删除功能代码
2013/04/23 Javascript
jquery异步跨域访问代码
2013/06/28 Javascript
jQuery模拟原生态App上拉刷新下拉加载更多页面及原理
2015/08/10 Javascript
Jquery easyui开启行编辑模式增删改操作
2016/01/14 Javascript
javascript简单判断输入内容是否合法的方法
2016/05/11 Javascript
JS获取IE版本号与HTML设置IE文档模式的方法
2016/10/09 Javascript
js点击任意区域弹出层消失实现代码
2016/12/27 Javascript
js实现产品缩略图效果
2017/03/10 Javascript
js微信分享实现代码
2020/10/11 Javascript
解决vue页面刷新或者后退参数丢失的问题
2018/03/13 Javascript
JS实现图片懒加载(lazyload)过程详解
2020/04/02 Javascript
vue+echarts实现动态折线图的方法与注意
2020/09/01 Javascript
python去除空格和换行符的实现方法(推荐)
2017/01/04 Python
python实现基于信息增益的决策树归纳
2018/12/18 Python
对Python定时任务的启动和停止方法详解
2019/02/19 Python
一行python实现树形结构的方法
2019/08/09 Python
Pytorch DataLoader 变长数据处理方式
2020/01/08 Python
信号生成及DFT的python实现方式
2020/02/25 Python
python实现坦克大战
2020/04/24 Python
Pycharm IDE的安装和使用教程详解
2020/04/30 Python
台湾深度自由行旅游平台:Tripbaa趣吧
2017/10/10 全球购物
《雪儿》教学反思
2014/04/17 职场文书
业务内勤岗位职责
2014/04/30 职场文书
求职信标题怎么写
2014/05/26 职场文书
群众路线对照检查材料
2014/09/22 职场文书
企业团队精神心得体会
2016/01/19 职场文书
工作计划范文之财务管理
2019/08/09 职场文书
用Python的绘图库(matplotlib)绘制小波能量谱
2021/04/17 Python
Redis调用Lua脚本及使用场景快速掌握
2022/03/16 Redis