当前位置: 首页 > news >正文

【前端】ES6:Proxy代理和Reflect对象

文章目录

  • 1 Proxy代理
    • 1.1 get方法
    • 1.2 set方法
    • 1.3 has方法
    • 1.4 this问题
  • 2 Reflect对象
    • 2.1 代替Object的某些方法
    • 2.2 修改某些Object方法返回结果
    • 2.3 命令式变为函数行为
    • 2.4 配合Proxy

1 Proxy代理

Proxy如其名,它的作用是在对象和和对象的属性值之间设置一个代理,获取该对象的值或者设置该对象的值, 以及实例化等等多种操作, 都会被拦截住, 经过这一层我们可以统一处理,我们可以认为它就是“代理器”。

ES6之前:

let obj = {}// let arr = [1,2,3] // push pop
// console.log(box)
Object.defineProperty(obj, "data", { // obj--对象,data--属性get(){console.log("get")return box.innerHTML},set(value){console.log("set",value)// 设置 dombox.innerHTML = value}
})console.log(obj)

1.1 get方法

let target = {}
let proxy = new Proxy(target, {get(target, prop){return target[prop]}
})

1.2 set方法

let target = {}
let proxy = new Proxy(target, {get(target, prop){return target[prop]},set(target, prop, value){if(prop === "data"){box.innerHTML = value}target[prop] = value;}
})

1.3 has方法

has捕获器,拦截对象属性的in操作符的调用,当使用in操作符来检查一个属性是否存在于一个对象时,如果对象是个proxy,has捕获器就会被调用。

let target = {_prop: "内部数据"
}
let proxy = new Proxy(target, {get(target, prop) {return target[prop]},set(target, prop, value) {if (prop === "data") {box.innerHTML = value}target[prop] = value;},has(target, key) {if (key[0] === '_') {return false;}return key in target;}
})

1.4 this问题

let target = new Set()
const proxy = new Proxy(target, {get(target, key) {const value =  target[key]// 遇到Function都手动绑定一下this// 正常调用时,this指向proxy// bind修正后,value方法的this指向target对象if(value instanceof Function) {console.log(`访问${value}方法了`)return value.bind(target)// 不能是call / apply,改变页面加载之后就立即执行,同步代码// bind 不会立即执行原函数,异步代码 }return value}
})
proxy.add(1)

Proxy本质上属于元编程非破坏性数据劫持,在原对象的基础上进行了功能的衍生而又不影响原对象,符合松耦合高内聚的设计理念。

2 Reflect对象

Reflect可以用于获取目标对象的行为,它与Object类似,但是更易读,为操作对象提供了一种更优雅的方式。它的方法与Proxy是对应的。

2.1 代替Object的某些方法

const obj = {
};
Reflect.defineProperty(obj, 'name', {value: 'kerwin',writable: false,configurable:false
});

2.2 修改某些Object方法返回结果

// 老写法
try {Object.defineProperty(target, property, attributes);// success
} catch (e) {// fail
}// 新写法
if(Reflect.defineProperty(target, property, attributes)) {// success
} else {// fail
}

2.3 命令式变为函数行为

const obj = {name:"kerwin"
};
//老写法
console.log("name" in obj) //true
//新写法
console.log(Reflect.has(obj, 'name')) //true//老写法
delete obj.name
//新写法
Reflect.deleteProperty(obj, "name")

2.4 配合Proxy

Reflect.set()和Reflect.get()。

let obj = {name:"kerwin"
}Reflect.set(obj, "age", 100)
console.log(Reflect.get(obj, "name"))
let target = new Set()
const proxy = new Proxy(target, {get(target, key) {const value = Reflect.get(target, key)if (value instanceof Function) {console.log(`访问${value}方法了`)return value.bind(target)}return value},set() { // set(target, key, value)return Reflect.set(...arguments)}
})
proxy.add(1)
let arr = [1, 2, 3]
let proxy = new Proxy(arr, {get(target, key) {console.log('get', key)return Reflect.get(...arguments)},set(target, key, value) {console.log('set', key, value)return Reflect.set(...arguments)}
})
proxy.push(4)
// 能够打印出很多内容
// get push     (寻找 proxy.push 方法)
// get length   (获取当前的 length)
// set 3 4      (设置 proxy[3] = 4)
// set length 4 (设置 proxy.length = 4)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 第五章 继承、多态、抽象类与接口 (4)
  • 简单了解 JVM
  • 前端入门:HTML+CSS简便开发的技巧
  • 没错,我给androidx修了一个bug!
  • 2024PDF内容修改秘籍:工具推荐与技巧分享
  • SpringBoot框架之KOB项目 - 配置Mysql与注册登录模块(上)
  • K8s容器运行时,移除Dockershim后存在哪些疑惑?
  • SpringBoot中基于Mybatis-Plus多表联查(无xml,通过注解实现)
  • WEB应用服务器TOMCAT
  • 【力扣】2376. 统计特殊整数
  • GO GIN SSE DEMO
  • 【Flink实战】flink消费http数据并将数组展开多行
  • AI健身之俯卧撑计数和姿态矫正-角度估计
  • 【JavaEE初阶】多线程7(面试要点)
  • 亚马逊IP关联揭秘:发生ip关联如何处理
  • 《Java编程思想》读书笔记-对象导论
  • 【Amaple教程】5. 插件
  • 0x05 Python数据分析,Anaconda八斩刀
  • CSS 专业技巧
  • CSS3 变换
  • echarts花样作死的坑
  • Java多态
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • magento2项目上线注意事项
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • SpiderData 2019年2月23日 DApp数据排行榜
  • 对超线程几个不同角度的解释
  • 机器学习中为什么要做归一化normalization
  • 技术发展面试
  • 聊聊flink的BlobWriter
  • 试着探索高并发下的系统架构面貌
  • 手写一个CommonJS打包工具(一)
  • 为什么要用IPython/Jupyter?
  • 我的zsh配置, 2019最新方案
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • 阿里云服务器购买完整流程
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​​​【收录 Hello 算法】9.4 小结
  • ​flutter 代码混淆
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #NOIP 2014# day.1 T2 联合权值
  • #QT(智能家居界面-界面切换)
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (十一)c52学习之旅-动态数码管
  • (实测可用)(3)Git的使用——RT Thread Stdio添加的软件包,github与gitee冲突造成无法上传文件到gitee
  • (四十一)大数据实战——spark的yarn模式生产环境部署
  • (算法设计与分析)第一章算法概述-习题
  • (一) springboot详细介绍
  • (转)JAVA中的堆栈
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • .env.development、.env.production、.env.staging
  • .md即markdown文件的基本常用编写语法