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 相关文章推荐
用javascript获取当页面上鼠标光标位置和触发事件的对象的代码
Dec 09 Javascript
让mayfish支持mysqli数据库驱动的实现方法
May 22 Javascript
JS的document.all函数使用示例
Dec 30 Javascript
关闭页面时window.location事件未执行的原因分析及解决方案
Sep 01 Javascript
解决js下referer兼容各大浏览器的方法
Nov 03 Javascript
在JavaScript应用中使用RequireJS来实现延迟加载
Jul 01 Javascript
js随机生成26个大小写字母
Feb 12 Javascript
第一次接触神奇的Bootstrap网格系统
Jul 27 Javascript
jQuery基本过滤选择器用法示例
Sep 09 Javascript
jQuery序列化后的表单值转换成Json
Jun 16 jQuery
vue模块拖拽实现示例代码
Mar 09 Javascript
使用JavaScrip模拟实现仿京东搜索框功能
Oct 16 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文件系统管理(实例讲解)
2017/09/19 PHP
如何让动态插入的javascript脚本代码跑起来。
2007/01/09 Javascript
新手入门常用代码集锦
2007/01/11 Javascript
Iframe 自适应高度并实时监控高度变化的js代码
2009/10/30 Javascript
javascript 进阶篇3 Ajax 、JSON、 Prototype介绍
2012/03/14 Javascript
jquery延迟加载外部js实现代码
2013/01/11 Javascript
extjs关于treePanel+chekBox全部选中以及清空选中问题探讨
2013/04/02 Javascript
JS+flash实现chrome和ie浏览器下同时可以复制粘贴
2013/09/22 Javascript
js如何判断用户是在PC端和还是移动端访问
2014/04/24 Javascript
jquery常用函数与方法汇总
2015/09/01 Javascript
jQuery+Ajax实现限制查询间隔的方法
2016/06/07 Javascript
JS修改地址栏参数实例代码
2016/06/14 Javascript
浅析jsopn跨域请求原理及cors(跨域资源共享)的完美解决方法
2017/02/06 Javascript
IDEA安装vue插件图文详解
2019/09/26 Javascript
jQuery实现可编辑的表格
2019/12/11 jQuery
js实现三角形粒子运动
2020/09/22 Javascript
详解为什么Vue中的v-if和v-for不建议一起用
2021/01/13 Vue.js
Python中的jquery PyQuery库使用小结
2014/05/13 Python
Python中最常用的操作列表的几种方法归纳
2015/04/24 Python
Python自动调用IE打开某个网站的方法
2015/06/03 Python
Python迭代器定义与简单用法分析
2018/04/30 Python
Flask框架Flask-Principal基本用法实例分析
2018/07/23 Python
python多线程调用exit无法退出的解决方法
2019/02/18 Python
pandas 数据结构之Series的使用方法
2019/06/21 Python
django框架model orM使用字典作为参数,保存数据的方法分析
2019/06/24 Python
django迁移数据库错误问题解决
2019/07/29 Python
Python使用py2neo操作图数据库neo4j的方法详解
2020/01/13 Python
Python之字典添加元素的几种方法
2020/09/30 Python
详解Django自定义图片和文件上传路径(upload_to)的2种方式
2020/12/01 Python
奇怪的鱼:Weird Fish
2018/03/18 全球购物
门卫班长岗位职责
2013/12/15 职场文书
初一体育教学反思
2014/01/29 职场文书
销售顾问岗位职责
2014/02/25 职场文书
七夕情人节促销方案
2014/06/07 职场文书
陈斌强事迹观后感
2015/06/17 职场文书
Dashboard管理Kubernetes集群与API访问配置
2022/04/01 Servers