【前端】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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/880583.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ISA Server配置https踩坑全过程

首先普通的http配置请参考 【ISA Server 2006发布Web网站】 https://www.bilibili.com/video/BV1qc411v75w/?share_sourcecopy_web&vd_sourcef35b2f2d0d34140bcba81b8b6f8c1b69 本文只一笔带过,讲一下https部分。 正解 由于我维护的是windows server 2003的…

计算机毕业设计 招生宣传管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

C语言扫盲

文章目录 C版本C语言特征GCCprintf数据类型函数指针内存管理void指针 Struct结构和Union结构typedef预处理器make工具cmake工具Projectintegral of sinc functionemulator embedded systeman event schedule 补充在线Linux终端安装Linux参考 建议还是国外教材学习…人家的PPT比…

物联网系统中OLED屏主流驱动方案详解

01 物联网系统中为什么要使用OLED驱动芯片 卓越的显示效果 1、高对比度和鲜艳色彩:OLED屏幕能够自发光,因此能够实现极高的对比度和鲜艳的色彩表现,这在物联网设备的显示界面上尤为重要,可以为用户提供更清晰、更生动的视觉体验…

[论文精读]TorWard: Discovery, Blocking, and Traceback of Malicious Traffic Over Tor

期刊名称:IEEE Transactions on Information Forensics and Security 发布链接:TorWard: Discovery, Blocking, and Traceback of Malicious Traffic Over Tor | IEEE Journals & Magazine | IEEE Xplore 中文译名:TorWard:…

jvm专题 之 内存模型

文章目录 前言一个java对象的运行过程jvm内存分布程序的基本运行程序对象什么是对象对象的创建一、类加载检查二、对象内存分配三、初始化零值四、设置对象头五、执行初始化方法 对象的访问定位 对象与类的关系由类创建对象的顺序 对象的创建 前言 一个程序需要运行&#xff0…

JNI实现Java调用C++函数

1. 测试环境 操作系统:win10JDK版本:JDK11 安装教程gcc版本:8.1.0 2. 声明native方法 // HelloJNI.java public class HelloJNI {// 输出Hello JNI from CPP. private native static void sayHello();// 实现两个整数相加private native s…

Android手机投屏方案实现方式对比

文章目录 1.概述2.术语解释2.1 miracast2.2 scrcpy2.4 Wifi Direct2.5 app_process 3.技术实现对比3.1 Miracast3.1.1 Miracast介绍3.1.2 Miracast原理3.1.3 Miracast优缺点分析 3.2 Scrcpy3.2.1 scrcpy 介绍3.2.2 scrcpy的实现原理3.2.3 scrcpy的优缺点分析 3.3 Google cast3.…

【学习笔记】手写 Tomcat 四

目录 一、Read 方法返回 -1 的问题 二、JDBC 优化 1. 创建配置文件 2. 创建工具类 3. 简化 JDBC 的步骤 三、修改密码 优化返回数据 创建修改密码的页面 注意 测试 四、优化响应动态资源 1. 创建 LoginServlet 类 2. 把登录功能的代码放到 LoginServlet 类 3. 创…

Python 算法交易实验89 QTV200日常推进-模式思考

说明 过去几天大A的表现还是比较戏剧化的。 让我想到了: 1 价稳量缩模式。之前很长一段时间都是这种状态,最终还是大爆发了,这个可取。2 周期模式。假设价格是一个周期为T(T可变)的正弦波,所以最终还是回到了几个月前的位置&…

UE学习篇ContentExample解读------Blueprints Advanced-下

文章目录 总览描述批次阅览2.1 Timeline animation2.2 Actor tracking2.3 Button Trigger using a blueprint interface2.4 Opening door with trigger2.5 Child Blueprints 概念总结致谢: 总览描述 打开关卡后,引入眼帘的就是针对关卡的总体性文字描述&…

物联网系统中基于IIC通信的数字温度传感器测温方案

01 物联网系统中为什么要使用数字式温度传感器芯片 物联网系统中使用数字式温度传感器芯片的原因主要有以下几点: 高精度与稳定性 高精度测量:数字式温度传感器芯片,如DS18B20,采用芯片集成技术,能够有效抑制外界不…

算法宝典——二分查找算法

1.认识二分查找 二分查找的时间复杂度:O(logN) 二分查找属于算法中耳熟能详的一类,通常的我们会说只有数组有序才可以使用二分查找,不过这种说法并不完全正确,只要数据具有"二段性"就可以使用二分查找,即我们可以找出一…

【零散技术】Odoo PDF 打印问题问题合集

序言:时间是我们最宝贵的财富,珍惜手上的每个时分 Odoo PDF打印 是一个必备功能,但是总会遇到一些奇奇怪怪的问题,此帖仅做记录,方便查阅。 目录 1、样式丢失 2、部分结构丢失 3、没有中文字体 1、样式丢失 这种情况一般是由于 …

ppt压缩有什么简单方法?压缩PPT文件的几种方法

ppt压缩有什么简单方法?许多用户常常面临文件过大的问题,尤其在需要通过电子邮件发送或上传至网络平台时,大文件会带来诸多麻烦。此外,较大的文件可能导致软件响应缓慢,从而影响整体的演示体验。因此,寻找有…

C++ 基础入门-命名空间、c++的输入输出、缺省参数、函数重载、引用、内联函数超详细讲解

这篇文章主要对c的学习做一个基础铺垫,方便后续学习。主要通过示例讲解命名空间、c的输入输出cout\cin,缺省参数、函数重载、引用、内联函数,auto关键字,for循环,nullptr以及涉及到的周边知识,面试题等。为…

机械键盘驱动调光DIY--【DAREU】

1 下载键盘对应的驱动,不要装到C盘 达尔优驱动下载中心 2 驱动更改教程 标准模式 键盘功能 鼠标功能 切换灯光 切换配置文件 多媒体 windows快捷键 禁用 Fn 启动程序 文本功能 光标定位 FN模式 灯光效果设置 注意 宏--自定义功能

面试扩展知识点

1.C语言中分为下面几个存储区 栈(stack): 由编译器自动分配释放堆(heap): 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收全局区(静态区): 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域&#…

用于探索和测试API的开源IDE工具-Bruno

1、前言 在进行软件开发与测试过程中,无论是开发人员还是测试人员,都会或多或少地进行接口调试与接口测试。尤其针对那种测试流程规范性很高的项目,测试人员进行接口测试是不可或缺的一部分。而这其中,大多数都会使用 Postman 作…

9.26 Buu俩题解

[CISCN2019 华东北赛区]Web2 看wp写完之后写的 知识点 存储型XSS与过滤绕过sql注入 题解 好几个页面,存在登录框可以注册,存在管理员页面(admin.php) ->既然存在管理员页面,且直接访问admin.php提示我们 说明存在身份验证&#xff0…