Proxy代理

常用拦截方法

ES5拦截:
let obj = {}
let newVal = ''
Object.defineProperty(obj, 'name', {
get() {
console.log('get');
return newVal
},
set(val) {
console.log('set');
newVal = val
}
})
obj.name = '张三'
console.log(obj.name);

  

proxy基本定义:
let pObj = {}
let p = new Proxy(pObj, {})
p.name = '李四'
console.log(pObj.name); // pObj的属性值已经通过p代理写入值

  

proxy常用的拦截钩子:
get
let arr = [1, 2, 3]
arr = new Proxy(arr, {
get(target, prop) {
console.log(`target:${target} prop:${prop}`);
return prop in target ? target[prop] : 'error'
}
})
console.log(arr[1]); let dict = {
'name': '王五',
'age': 18
}
dict = new Proxy(dict, {
get(target, prop) {
console.log(`target:${target} prop:${prop}`);
return prop in target ? target[prop] : prop;
}
})
console.log(dict['name']); // 王五
console.log(dict['class']); // class

  

set
let arr2 = []
arr2 = new Proxy(arr2, {
set(target, prop, val) {
if (typeof val === 'number') {
target[prop] = val
return true
} else {
return false
}
}
})
arr2.push(5)
arr2.push(6)
console.log(arr2[0], arr2[1]);

  

has
let range = {
start: 1,
end: 5
} range = new Proxy(range, {
has(target, prop) {
return prop >= target.start && prop <= target.end
}
})
console.log(2 in range); // true
console.log(9 in range); // false

  

ownKeys,循环遍历的时候进行拦截
deleteProperty,删除拦截
现在我们把_开头的属性为似有属性,不进行遍历出来
我们禁止_开头的似有属性删除
let user = {
name: '张三',
age: 18,
_password: '***'
}
user = new Proxy(user, {
ownKeys(target) {
return Object.keys(target).filter(key => !key.startsWith('_'))
},
deleteProperty(target, prop) {
if (prop.startsWith('_')) {
throw new Error('不可删除')
} else {
delete target[prop]
return true
}
}
})
for (let key in user) {
console.log(key);
} try {
delete user._password;
} catch (e) {
console.log(e.message);
}

  

apply,拦截函数调用、call、apply的操作
let sum = (...args) => {
let num = 0;
args.forEach(item => {
num += item
})
return num
}
sum = new Proxy(sum, {
apply(target, ctx, args) {
return target(...args) * 2
}
})
console.log(sum(1, 2));
console.log(sum.call(null, 1, 2));
console.log(sum.apply(null, [1, 2]));

  

construct,拦截new
let People = class {
constructor(name) {
this.name = name
}
}
People = new Proxy(People, {
construct(target, args, newTarget) {
console.log('construct');
return new target(...args)
}
})
console.log(new People('张三'));

  

ES6-11学习笔记--代理Proxy的更多相关文章

  1. C++11 学习笔记 std::function和bind绑定器

    C++11 学习笔记 std::function和bind绑定器 一.std::function C++中的可调用对象虽然具有比较统一操作形式(除了类成员指针之外,都是后面加括号进行调用),但定义方法 ...

  2. 学习笔记——代理模式Proxy

    代理模式,主要是逻辑和实现解耦.具体逻辑如何,由代理Proxy自己来设计,我们只需要把逻辑Subject交给代理即可. 主要应用场景,包括创建大开销对象时,使用代理来慢慢创建:远程代理,如网络不确定时 ...

  3. Spring学习笔记--代理

    静态代理 1.静态代理的角色分析(UML画图推荐使用StarUML软件) 抽象角色---一般使用接口或者抽象类来实现. 真实角色---被代理的角色. 代理角色---代理真实角色—代理真是角色后一般会做 ...

  4. Java-马士兵设计模式学习笔记-代理模式-动态代理 调用Proxy.newProxyInstance()

    一.概述 1.目标:不自己写代理类,利用Proxy.newProxyInstance()动态生成 2.用到的知识点: (1)//编译源码,生成class,注意编译环境要换成jdk才有compiler, ...

  5. Java-马士兵设计模式学习笔记-代理模式-聚合与继承方式比较

    一.概述 1.目标:要在Tank的move()方法做时间代理及日志代理(可以设想以后还要增加很多代理处理),且代理间的顺序可活更换 2.思路: (1)聚合:代理类聚合了被代理类,且代理类及被代理类都实 ...

  6. Java-马士兵设计模式学习笔记-代理模式-动态代理 修改成可以任意修改代理逻辑

    一.概述 1.目标:动态代理的代理逻辑可以任意修改 2.思路: (1)要把代理逻辑抽离,站在jvm的角度思考,应独立出InvocationHandler接口,并接收被代理的对象及方法作为参数invok ...

  7. ngx_lua学习笔记 -- capture + proxy 实现httpclient

    题注 最近我在学习nginx的lua插件,发现结合nginx的异步io和lua的流程控制能力,还是有很丰富的想象空间的:几乎所有常见的http请求的处理逻辑都能搞定,诸如查查数据库,访问一下memca ...

  8. vue.js 源代码学习笔记 ----- instance proxy

    /* not type checking this file because flow doesn't play well with Proxy */ import config from 'core ...

  9. es6.3学习笔记

    es版本发布相当快,从1.x到2.x,再直接到5.x,6.x 索引这个词在es中有多重意思: 索引(名词):一个索引类似于传统数据库中的一个索引,用于存储关系型文档.索引的复数为indexes或ind ...

随机推荐

  1. Tableau学习Step5一表计算、详细级别表达式、动作、外接python

    Tableau学习Step5一表计算.详细级别表达式.动作.外接python 本文首发于博客冰山一树Sankey,去博客浏览效果更好. ) Tableau学习Step4一数据解释.异常值监测.参数使用 ...

  2. Python——模块&包&异常

    模块&包&异常 一. 模块 Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义(变量)和Python语句. 模块能定义函数 ...

  3. JZ-063-数据流中的中位数

    数据流中的中位数 题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两 ...

  4. LeetCode-071-简化路径

    简化路径 题目描述:给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 '/' 开头),请你将其转化为更加简洁的规范路径. 在 Unix 风格的文件系统中,一个点(. ...

  5. java实现上传图片并压缩图片大小功能

    缩略图压缩文件jar包 <!-- 图片缩略图 --> <dependency> <groupId>net.coobird</groupId> <a ...

  6. 微信小程序下滑时能实现加载更多数据

    wxml代码: <view class="scroll"> <!-- 绑订页面上拉触底事件的处理函数onReachBottom事件 --> <scro ...

  7. Python文件读写--错误一

    在学习python的文件读写操作的时候,我遇到了一点麻烦事,觉得可以记录下来,先上代码吧. with open('test.txt') as file: file.write('test') prin ...

  8. centos7 安装 nginx-1.18.0 并设置开机自启动

    一.到官网下载nginx Mainline  version:  nginx主力版本,为开发版 Stable version: 稳定版,在生产环境中选择此版本进行安装 Legacy versions: ...

  9. nginx配置负载均衡分发服务器笔记

    记录学习搭建nginx负载均衡分发服务器的过程笔记 1.服务器IP:192.168.31.202(当前需要搭建nginx负载均衡分发的服务器)安装好nginx 2.在服务器IP:192.168.31. ...

  10. 1、如何抓取Modbus TCP/UDP 数据包实战

    CEIWEI最近发布了Modbus RTU Over TCP/UDP 过滤监控的新工具,下面以Modbus RTU TCP为示例,讲解如何抓取Modbus通信数据包,因为CEIWEI ModbusMo ...