ES6系列_13之Proxy进行预处理(简单学习)
1.理解什么是预处理?
当我们在操作一个对象或者方法时会有几种动作,比如:在运行函数前初始化一些数据,在改变对象值后做一些善后处理。这些都算钩子函数,Proxy的存在就可以让我们给函数加上这样的钩子函数。
Proxy进行预处理可以简单理解为:执行方法前,先预处理代码(预热工作)。
2.对比引入Proxy
我们先来回顾一下定义对象的方法。
- var obj={
- add:function(val){
- return val+100;
- },
- name:"小红"
- };
- console.log(obj.add(100)); //
- console.log(obj.name);//小红
声明了一个obj对象,增加了一个对象方法add和一个对象属性name,然后在控制台进行了打印。
这个时候我们想在执行obj对象之前做一些事,我们应该怎么办呢?我们的es6提供的proxy就出场了。它给我们提供了预处理机制,在某件事情执行之前,先做一些预热工作,然后才真正执行我们的目标。
(1)Proxy的声明
我们用new的方法对Proxy进行声明,基本格式如下:
- new Proxy({},{});
需要注意的是这里是两个花括号,第一个花括号就相当于我们方法的主体,后边的花括号就是Proxy代理处理区域,相当于我们写钩子函数的地方。
将上述代码改进一下,完成在执行add方法前先在控制台输出一个"准备执行add方法"的文字。
- var pro = new Proxy({
- add: function (val) {
- return val + 100;
- },
- name: '小红'
- }, {
- get:function(target,key,property){
- console.log('准备执行add方法');
- return target[key];
- }
- });
- console.log(pro.name);
结果为:先输出:准备执行add方法,在输出小红
总结:相当于在方法调用前的钩子函数。
下面来看看get方法中的一些参数:
get属性:
get属性是在你得到某对象属性值时预处理的方法,他接受三个参数
- target:得到的目标值
- key:目标的key值,相当于对象的属性
- property:被获取的属性名。
- var pro = new Proxy({
- add: function (val) {
- return val + 10;
- },
- name: '张三'
- }, {
- set:function(target,key,value,receiver){
- console.log(`setting ${key} = ${value}`);
- return target[key] = value;
- }
- });
- pro.name="李四";
- console.log(pro.name); //李四
输出结果为:
set属性
set属性是值你要改变Proxy属性值时,进行的预先处理。它接收四个参数。
- target:目标值。
- key:目标的Key值。
- value:要改变的值。
- receiver:改变前的原始值。
3.apply的使用
方法的预处理。
apply的作用是调用内部的方法,它使用在方法体是一个匿名函数时。看下边的代码
- let target = function () {
- return 'doing target';
- };
- var handler = {
- apply(target, ctx, args) {
- console.log('do apply');
- return Reflect.apply(...arguments);
- }
- }
- var pro = new Proxy(target, handler);
- console.log(pro());
apply方法可以接收三个参数,依次是目标对象,目标对象的上下文对象(this)和目标对象的参数数组。
上面代码中,每当执行proxy函数(直接调用或call和apply调用),就会被apply方法拦截。
每天学习一点,加油。待续。。。。
ES6系列_13之Proxy进行预处理(简单学习)的更多相关文章
- ES6系列_14之promise对象的简单使用
1.产生原因 在前端开发中,最常见的的就是"回调",我相信很多人对于这个"回调"可谓是印象深刻呢.究其原因是因为层层回调会造成所谓的“回调地狱 (callbac ...
- 大白话,讲编程之《ES6系列连载》汇总
如果你经历过2,3年前的前端开发,你一定感受过兼容IE6,7的痛苦,一定用过网页三剑客的dreamweaver编写html,面试的时候面试官一定会问你:会用PS切图吗? 刚开始的时候你发现,web前端 ...
- ES6 系列之异步处理实战
前言 我们以查找指定目录下的最大文件为例,感受从 回调函数 -> Promise -> Generator -> Async 异步处理方式的改变. API 介绍 为了实现这个功能,我 ...
- [ES6系列-01]Class:面向对象的“新仇旧恨”
[原创]CoderPower 大家好,这里是码路工人有力量,我是码路工人,你们是力量. 这是公众号(码路工人有力量)开通后的第二篇,写得还是有待改进吧.这次准备写一个关于ES6基础的短文系列,努力尽快 ...
- 循序渐进做项目系列(2):最简单的C/S程序——消息异步调用与消息同步调用
上篇博客 循序渐进做项目系列(1):最简单的C/S程序——让服务器来做加法 实现了一个最简单的C/S程序,即让服务器来做加法.当时为了通俗易懂采用了消息异步调用的方式.今天我们要采用消息同步调用的方式 ...
- ES6新特性:Proxy代理器
ES6新特性:Proxy: 要使用的话, 直接在浏览器中执行即可, node和babel目前还没有Proxy的polyfill;,要使用的话,直接在浏览器中运行就好了, 浏览器的兼容性为:chrome ...
- [js高手之路] es6系列教程 - 对象功能扩展详解
第一:字面量对象的方法,支持缩写形式 //es6之前,这么写 var User = { name : 'ghostwu', showName : function(){ return this.nam ...
- [js高手之路] es6系列教程 - 迭代器,生成器,for...of,entries,values,keys等详解
接着上文[js高手之路] es6系列教程 - 迭代器与生成器详解继续. 在es6中引入了一个新的循环结构for ....of, 主要是用来循环可迭代的对象,那么什么是可迭代的对象呢? 可迭代的对象一般 ...
- ES6 系列之 Babel 是如何编译 Class 的(下)
前言 ES5 寄生组合式继承 function Parent (name) { this.name = name; } Parent.prototype.getName = function () { ...
随机推荐
- Linux 下升级JDK 1.7到1.8
1.下载1.8的jdk rpm文件到linux系统 2.执行rpm -ivh jdk-8u151-linux-x64.rpm 选项详解: -a:查询所有套件: -b<完成阶段><套件 ...
- socket中 emit和on的写法
socket.emit('action');表示发送了一个action命令,命令是字符串的,在另一端接收时,可以这么写: socket.on('action',function(){...});soc ...
- ansible入门02
1.常用模块 1.1 group模块 添加或删除组 name= state=:present(添加),absent(删除) sy ...
- 解决Jenkins权限配置错误,导致登录时出现没有Overall/read权限
问题 由于初次接触jenkins,于是在搭建好jenkins以后,想要对用户进行管理,于是乎开始在系统管理->configure Global Security里设置用户的权限. 在启用安全-& ...
- I.MX6 Manufacturing Tool V2 (MFGTool2) Emmc mksdcard.sh hacking
#!/bin/sh # 参考文章: # . MFGTool Emmc mksdcard.sh MFGTool Emmc mksdcard.sh comment # http://jordonwu.gi ...
- vue-cli 本地开发mock数据使用方法
vue-cli 中可以通过配置 proxyTable 解决开发环境的跨域问题,具体可以参考这篇文章: Vue-cli proxyTable 解决开发环境的跨域问题 如果后端接口尚未开发完成,前端开发一 ...
- 基于http协议的加密传输方案
最近公司需要通过公网与其它平台完成接口对接,但是基于开发时间和其它因素的考虑,本次对接无法采用https协议实现.既然不能用https协议,那就退而求其次采用http协议吧! 那么问题来了!在对接的过 ...
- UOJ 348 【WC2018】州区划分——子集卷积
题目:http://uoj.ac/problem/348 参考:https://www.cnblogs.com/NaVi-Awson/p/9242645.html#%E5%AD%90%E9%9B%86 ...
- 【linux】mkdir -p命令
如果要创建目录A并创建目录A的子目录B,没有用-p的情况下是mkdir 2次 如果用-p 可以直接创建2个目录 (迭代创建).mkdir -p 目录A/子目录B就可以
- TextRank in Python
运用到nltk,sklearn,networkx等很多好用的库,值得参考 https://joshbohde.com/blog/document-summarization