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 相关文章推荐
非常棒的10款jQuery 幻灯片插件
Jun 14 Javascript
jQuery简单实现遍历数组的方法
Apr 14 Javascript
第六篇Bootstrap表格样式介绍
Jun 21 Javascript
BootStrap Table 分页后重新搜索问题的解决办法
Aug 08 Javascript
深入理解bootstrap框架之入门准备
Oct 09 Javascript
JS检测数组类型的方法小结
Mar 14 Javascript
Node.js 8 中的 util.promisify的详解
Jun 12 Javascript
Angular中封装fancyBox(图片预览)遇到问题小结
Sep 01 Javascript
AngularJS的$location使用方法详解
Oct 19 Javascript
vue遍历对象中的数组取值示例
Nov 07 Javascript
vue实现element表格里表头信息提示功能(推荐)
Nov 20 Javascript
使用eslint和githooks统一前端风格的技巧
Jul 29 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中的cookie
2006/11/26 PHP
PHP中基于ts与nts版本- vc6和vc9编译版本的区别详解
2013/04/26 PHP
php过滤所有恶意字符(批量过滤post,get敏感数据)
2014/03/18 PHP
在PHP模板引擎smarty生成随机数的方法和math函数详解
2014/04/24 PHP
PHP英文字母大小写转换函数小结
2014/05/03 PHP
ThinkPHP3.1查询语言详解
2014/06/19 PHP
typecho插件编写教程(一):Hello World
2015/05/28 PHP
php 问卷调查结果统计
2015/10/08 PHP
详解PHP安装mysql.so扩展的方法
2016/12/31 PHP
Laravel中如何轻松容易的输出完整的SQL语句
2020/07/26 PHP
JQuery 遮罩层实现(mask)实现代码
2010/01/09 Javascript
js 金额文本框实现代码
2012/02/14 Javascript
jquery学习总结(超级详细)
2014/09/04 Javascript
angularJS提交表单(form)
2015/02/09 Javascript
JavaScript函数详解
2015/02/27 Javascript
JavaScript实现带标题的图片轮播特效
2015/05/20 Javascript
全面解析Bootstrap排版使用方法(标题)
2015/11/30 Javascript
Bootstrap组件学习之导航、标签、面包屑导航(精品)
2016/05/17 Javascript
Node.js的Koa框架上手及MySQL操作指南
2016/06/13 Javascript
13 个npm 快速开发技巧(推荐)
2019/07/04 Javascript
vue中echarts图表大小适应窗口大小且不需要刷新案例
2020/07/19 Javascript
VUE子组件向父组件传值详解(含传多值及添加额外参数场景)
2020/09/01 Javascript
js实现贪吃蛇游戏(简易版)
2020/09/29 Javascript
深入了解Vue动态组件和异步组件
2021/01/26 Vue.js
[03:42]2014DOTA2国际邀请赛 第三日比赛排位扑朔迷离
2014/07/12 DOTA
[02:12]Dota 2 推出全新英雄—— 电炎绝手
2019/08/23 DOTA
深入理解python中的浅拷贝和深拷贝
2016/05/30 Python
Pandas:DataFrame对象的基础操作方法
2018/06/07 Python
Python爬虫实现(伪)球迷速成
2018/06/10 Python
在unittest中使用 logging 模块记录测试数据的方法
2018/11/30 Python
使用wxpy实现自动发送微信消息功能
2020/02/28 Python
css3 按钮样式简单可扩展创建
2013/03/18 HTML / CSS
毕业自荐信
2013/12/16 职场文书
通知书大全
2015/04/27 职场文书
廉政承诺书2015
2015/04/28 职场文书
欢迎新生标语2015
2015/07/16 职场文书