近日喜欢上了uniapp和vue,但看到相关程序代码中频繁出现了proxy和reflect的使用,于是进行了一番学习,现总结如下。

Proxy和Reflect是ES6(ECMAScript 2015)引入的两个新的特性,它们共同提供了一种可编程的方式,用于拦截、修改、和定义JavaScript对象的基本行为。在这里,我将简单介绍Proxy和Reflect的概念,以及它们的用法。

Proxy是一个代理对象,它可以用来拦截JavaScript对象的一些基本操作。代理对象包装了目标对象,并可以在目标对象上定义各种拦截器。拦截器是一些函数,它们被调用以响应目标对象的行为。例如,当代理对象的属性被访问时,拦截器可以拦截这个行为并返回一个不同的值,或者抛出一个错误。

下面是一个例子,展示了如何使用Proxy来拦截对象的读取操作:

const target = {
name: "Alice",
age: 30
}; const handler = {
get: function(target, prop) {
console.log(`Reading property '${prop}'`);
return target[prop];
}
}; const proxy = new Proxy(target, handler); console.log(proxy.name); // 输出 "Reading property 'name'" 和 "Alice"

在这个例子中,我们定义了一个代理对象proxy,它包装了一个目标对象target。我们还定义了一个拦截器handler,其中的get方法被调用以拦截proxy对象的属性读取操作。当我们使用proxy.name读取代理对象的name属性时,拦截器会输出一条日志并返回目标对象的name属性值。

Proxy是一种代理对象,它允许你定义自定义的行为,例如:属性的读取和赋值、函数调用、构造函数调用等等。当你创建一个代理对象时,你可以传递一个处理程序对象,这个处理程序对象定义了代理对象的行为。例如:

let obj = new Proxy({}, {
get(target, prop) {
console.log(`Getting property "${prop}"`);
return target[prop];
},
set(target, prop, value) {
console.log(`Setting property "${prop}" to "${value}"`);
target[prop] = value;
}
}); obj.foo = "bar";
console.log(obj.foo); // 输出 "Getting property "foo" bar"

在上面的代码中,我们创建了一个空对象的代理,然后定义了一个处理程序对象,该处理程序对象将处理代理对象的属性访问。当我们给代理对象设置一个属性时,代理对象会调用设置属性的处理程序,该处理程序会输出一条消息。当我们获取代理对象的属性时,代理对象会调用获取属性的处理程序,该处理程序也会输出一条消息。

Reflect则是一个内置对象,它提供了一组方法来操作JavaScript对象。Reflect的方法与一些对象操作的方法(例如Object.defineProperty和Object.create)非常相似,但是Reflect方法更加一致和易于使用,并且可以作为函数调用。Reflect提供的方法与Proxy对象的拦截器方法相对应。Reflect方法返回值与Proxy对象的拦截器方法返回值是相同的。这些方法包括Reflect.get()Reflect.set()Reflect.has()Reflect.deleteProperty()等等。例如:

let obj = { foo: "bar" };

Reflect.set(obj, "foo", "baz"); // 设置 "foo" 的值为 "baz"
console.log(Reflect.get(obj, "foo")); // 输出 "baz"

在上面的代码中,我们使用Reflect.set方法设置了obj对象的"foo"属性的值为"baz",然后使用Reflect.get方法获取了obj对象的"foo"属性的值。与Proxy类似,Reflect还提供了许多其他方法,例如Reflect.construct用于调用构造函数,Reflect.defineProperty用于定义属性等等。

下面是一个例子,展示了如何使用Reflect来代替对象操作:

const obj = { a: 1 };

console.log(obj.a); // 输出 1

const proxy = new Proxy(obj, {
get: function(target, prop, receiver) {
console.log(`Reading property '${prop}'`);
return Reflect.get(target, prop, receiver);
}
}); console.log(proxy.a); // 输出 "Reading property 'a'" 和 1

在这个例子中,我们使用Reflect的get方法来代替了拦截器方法中的return target[prop]。这种方式使代码更简洁和易于维护,因为我们可以使用标准的对象操作方法,同时还可以在拦截器中进行自定义操作。

总之,Proxy和Reflect是一对非常强大的特性,它们可以帮助我们更灵活、更可控地操作JavaScript对象。使用它们,我们可以实现一些很酷的功能,例如数据验证、对象代理

浅谈下javascript的proxy和reflect的更多相关文章

  1. 浅谈ES6中的Proxy

    Proxy是一个很有趣的对象,它能够修改某些操作的默认行为,等同于在语言层面做出修改,属于一种‘元编程’,即对编程语言进行编程. Proxy其实很好理解,就是在目标对象之前架设一层拦截,外界的访问都得 ...

  2. 浅谈前端JavaScript编程风格

    前言 多家公司和组织已经公开了它们的风格规范,详细可參阅jscs.info,以下的内容主要參考了Airbnb的JavaScript风格规范.当然还有google的编程建议等编程风格 本章探讨怎样使用E ...

  3. 浅谈原生JavaScript的动画和特效

    一.JavaScript中的动画原理 动画效果的实现总的来说可分为两种,一种是利用纯css实现,该方法在css3成熟后广泛应用:另外一种是通过JavaScript(或者一些封装的库如jQuery的an ...

  4. 浅谈Array --JavaScript内置对象

    Array --JavaScript内置对象 描述 可以用一个变量存储多种数据类型的Array对象,Array不是关联数组,不能使用字符串作为索引访问数组元素,需要使用非负整数的下标访问数组中的元素. ...

  5. 浅谈 原生javaScript&&react 实现全局触摸按钮(附带对addeventlistener的了解)

    1.采用原生javaACript 实现全局触摸按钮 首先在控制台输出,观察事件有哪些关于触摸的字段可以使用,然后拿这些字段的数据开始来写方法. 因为要做的是全局触摸按钮,我需要拿到的是按钮时时的坐标位 ...

  6. 浅谈原生JavaScript实现remove()和recover()

    利用原生JavaScript实现: 1.remove(selectors)删除指定的一个或一组元素. 2.recover(selectors)恢复刚才删除的元素. function remove(se ...

  7. 浅谈 原生javaScript && react 实现全局触摸按钮(附带对addeventlistener的了解)

    1.采用原生javaACript 实现全局触摸按钮 首先在控制台输出,观察事件有哪些关于触摸的字段可以使用,然后拿这些字段的数据开始来写方法. 因为要做的是全局触摸按钮,我需要拿到的是按钮时时的坐标位 ...

  8. 浅谈JavaScript中闭包

    引言 闭包可以说是JavaScript中最有特色的一个地方,很好的理解闭包是更深层次的学习JavaScript的基础.这篇文章我们就来简单的谈下JavaScript下的闭包. 闭包是什么? 闭包是什么 ...

  9. 浅谈Nginx负载均衡和F5的区别

    前言 笔者最近在负责某集团网站时,同时用到了Nginx与F5,如图所示,负载均衡器F5作为处理外界请求的第一道"墙",将请求分发到web服务器后,web服务器上的Nginx再进行处 ...

  10. 浅谈Objective—C中的面向对象特性

    Objective-C世界中的面向对象程序设计 面向对象称程序设计可能是现在最常用的程序设计模式.如何开发实际的程序是存在两个派系的-- 面向对象语言--在过去的几十年中,很多的面向对象语言被发明出来 ...

随机推荐

  1. 【实操记录】MySQL主从配置

    本文使用MySQL原生支持的主从同步机制,详细记录了配置步骤及运维操作方法,可供大家直接参考.使用. 本文假设已经部署了两台主机的MySQL软件,且数据库服务正常,详细部署步骤可本站搜索:" ...

  2. C#——接口

    先来看看微软官方对接口的定义与说明. 接口定义协定. 实现接口的类或结构必须遵循它的协定. 接口可以从多个基接口继承,类或结构可以实现多个接口. 接口可以包含方法.属性.事件和索引器. 接口本身不提供 ...

  3. oeasy教您玩转vim - 81 - # 宏macro的进阶

    ​ 宏的进阶 macro 回忆 关于宏,上次有4个要点 qa 开始录制宏 q 结束录制宏 @a 应用宏 qA 追加录制宏 甚至可以编辑宏 "ap 把宏作为文本粘贴出来 编辑之后 " ...

  4. Python爬虫Post请求返回值为-1000

    今天写了一个简单的爬虫程序,为了爬取kfc官网的餐厅数据,代码如下 # ajax的post请求--肯德基官网 def create_request(page): url='http://www.kfc ...

  5. MViTv2:Facebook出品,进一步优化的多尺度ViT | CVPR 2022

    论文将Multiscale Vision Transformers (MViTv2) 作为图像和视频分类以及对象检测的统一架构进行研究,结合分解的相对位置编码和残差池化连接提出了MViT的改进版本 来 ...

  6. c++17 structure binding test

    1 /*test for struct binding*/ 2 3 #include <string> 4 #include <iostream> 5 using namesp ...

  7. windows生成苹果私钥证书p12证书和profile文件的方法

    hbuilderx出现已经有差不多10年时间了,现在越来越多的企业,开始使用跨平台性更优秀的uniapp来开发ios app. 开发ios app的时候,打包需要苹果的私钥证书和证书profile文件 ...

  8. 【SQL】 去掉最后一段,只保留前段

    需求描述: 例如给出这样一个地址或者其他字符: 10.11.12.13 192.168.177.209101.102.103.104.105 ... 要求只保留前面的部分,去掉最后一部分 10.11. ...

  9. 【Centos】RPM安装Mysql8

    先去官网下载RPM包,没想到RPM包是红帽发行版 https://dev.mysql.com/downloads/mysql/ 使用wget直接下载到Centos里面: wget https://cd ...

  10. 【IDEA】使用Maven骨架创建JavaWeb项目

    IDEA版本:2020.1 骨架选项名称: org.apache.maven.archetypes:maven-archetype-webapp 本项目的Maven坐标设置: 设置优先从本地获取骨架: ...