ES6 Proxy 和 Reflect 用法

ES6~ES10新增功能proxy、reflect、promise对象、迭代 Reflect对象的方法与Proxy对象的方法一一对应,只要是Proxy对象的方法,就能在Reflect对象上找到对应的方法。现阶段,某些方法同时在Object和Reflect对象上部署,未来的新方法将只部署在Reflect对象上。虽然 Proxy 可以代理针对目标对象的访问,但它不是目标对象的透明代理,即不做任何拦截的情况下,也无法保证与目标对象的行为一致。Proxy.revocable()方法返回一个对象,该对象的proxy属性是Proxy实例,revoke属性是一个函数,可以取消Proxy实例。 阅读详情

前言:

ES6 Proxy和Reflect是一个蛮有用的组合,这两个属性相辅相成。这篇文章是通过用这两个属性来写一个 简单的常用实例。也通过这个实例来说明Proxy和Reflect几个常用的方法。


Proxy是什么?

Proxy用于修改某些操作的默认行为,等同于在语言层面作出修改,需要一种“元编程”,即对编程语言进行编程。可以理解为对目标对象设置“拦截”层,外界访问该对象必须先通过拦截层。因此提供了一种机制,可以对外界的访问进行过滤和改写。Proxy这个词翻译为代理。

let proto = {
    set : function(key,value){
        console.log(`setting ${key}=${value}`);
    }
}

let demo = new Proxy({},proto);
demo.age = 100;//输出“setting age=100”

Reflect是什么?

Reflect对象设计目的有以下几个。
1.将Object对象的一些明显属于语言层面的方法放到Reflect对象上。

Object.defineProperty
Reflect.defineProperty

2.修改某些Object方法的返回结果,让其变得更合理。比如Object.defineProperty(obj, name, desc)在无法定义属性时会抛出一个错误,而Reflect.defineProperty(obj, name, desc)则会返回false。
原来

try {
  Object.defineProperty(obj, name, desc);
  // property defined successfully
} catch (e) {
  // possible failure (and might accidentally catch the wrong exception)
}

重构后:

if (Reflect.defineProperty(obj, name, desc)) {
  // success
} else {
  // failure
}

3.让Object操作都编程函数行为。某些Object操作是命令式,比如name in obj和delete obj[name],而Reflect.has(obj,name)和Refect.deleteProperty(obj,name)让它们变成了函数行为。

4.Reflect对象的方法与Proxy对象的方法一一对应,只要是Proxy对象的方法,就能在Reflect对象找到相应的方法。Proxy是修改对象的行为,而Reflect是获取对象默认行为。


Rroxy和Reflect实例:

let proto = {
     get : function(target,key,receiver){//拦截获值
        console.log('getting ${key}!');
        return Reflect.get(target, key,receiver);
     },
     set : function(target, key,value,receiver){//拦截设值
        console.log('setting ${key}!');
        return Reflect.set(target,key,value,receiver);
     },
    apply:function(target,thisArg,args){//拦截调用方法
        console.log('apply');
        return Reflect.apply(target,thisArg,args);
    },
    construct:function(target,thisArg,proxy){//拦截new
        console.log('construct');
        return Relect.apply(target,thisArg,proxy);
    },
    deleteProperty:function(target,key){//拦截删除元素
        console.log('delete '+${key});
        return Relect.deleteProperty(target,key);
    },
    enumerate:function(target){//拦截for...in循环
        console.log('enumerate')
        return Relect.enumerate(target)
    },
    has(target,key){//隐藏某些属性,不被in操作符发现
        if(key[0]==='_'){
            console.log('has')
            return false;
        }
        return Relect.has(target,key) 
    }
}


let demo = new Proxy({},proto);

/*触发方法*/
demo.name;//getting name!
demo.age = 100; //setting age!
demo()//apply
new demo()//construct
delete demo.age //delete age

var p = "asdf";
for(let x in p){}//enumerate;

var q = "_123";
for(let x in q){}//has;

附:ES6转换ES2015

http://blog.youkuaiyun.com/rth362147773/article/details/78275551

Verilog——反相器 反相器代码: module inv( A, Y );//A,Y是端口 //定义端口属性 input A; output Y; //定义输入输出关系 assign Y=~A;//Y等于A的反 endmodule //inv是module的名字 阅读详情

相关推荐

轻量级NAS的隐秘战场:比特米盒CumeBox2与CasaOS的生态融合实践

本文探讨了比特米盒CumeBox2轻量级NAS设备与CasaOS操作系统的生态融合实践。通过硬件选型、系统部署、性能优化和应用场景分析,展示了如何将CumeBox2与CasaOS深度整合,打造经济实用的家庭数据管理中心,特别适合入门级用户和小型办公环境。

rl6adventurer的博客 892

ES6之Reflect和Proxy

目录一、Reflect1. 概述二、Proxy 一、Reflect 1. 概述 设计Reflect主要有以下四个目的: 将Object上属于语言内部的方法部署到Reflect,并且以后新增的语言内部方法只会部署到Reflect上。如Object.defineProperty在ES6中可以通过Reflect.defineProperty调用,并且前者在之后的版本中将不再被推荐。 规范某些Objec...

夕山雨的博客 1897

基于Java+Maven+Testng+RestAssured+Allure+Jenkins搭建一个接口自动化框架

2、有一个提取表达式列,通过编写每个接口的JSON提取表达式,后边在解析Excel时,对接口执行后的响应数据用该表达式提取出来,保存到环境变量,如果某些接口需要前置接口的响应数据,我们就可以从环境变量中获取该数据出来,从而解决了接口关联的问题。1、在之前介绍过全局配置类Contants中添加一个控制台日志开关控制权限,如果选择为false,则控制台不输出日志,将日志输出到allure报表,选择为true,则在控制台输出日志,不输出到allure报表。

专注于技术分享的博主 1183

ES6 Proxy和Reflect

Proxy 对象用于创建一个对象的代理,从而实现基本操作的拦截和自定义(如属性查找、赋值、枚举、函数调用等)。属于“元编程”,即对编程语言进行编程。如对对象a进行拦截就 let p = new Proxy(obj,handler)在handler里面编写拦截逻辑;又如有对象a和b,想要对对象a中实现拦截对象b的属性,就将对象b设置到对象a的原型上再编写拦截逻辑;

黎小小的博客 734

MATLAB并行开不了的解决办法

在服务器上新安装了MATLAB 2013b,在开并行计算的时候出现了下列问题 经过在网上搜多这个问题,我感觉这个问题应该是安装的时候的验证问题或者激活不成功之类的。注意其中有一句validate the profile ‘local’ in the Cluster Profile Manager.在matlab官网上找到了设置Cluster Manager的教程,如下 parallel>

sinat_36713319的博客 5987

鱼眼相机去畸变(图像拉直/展开/矫正)算法及实战总结

1、算法说明经纬度矫正法, 可以把鱼眼图想象成半个地球, 然后将地球展开成地图,经纬度矫正法主要是利用几何原理, 对图像进行展开矫正。经过P点的入射光线没有透镜的话,本应交于相机成像平面的e点。然而,经过鱼眼相机的折射,光线会交于相机成像平面的d点,就产生了畸变,因此畸变图像整体上呈现出像素朝图像中心点聚集的态势。而去畸变,就是将折射到d点的点,重新映射回到e点,因此去畸变之后的图像与原始的鱼眼图像相比,仿佛是把向心聚集的像素又重新向四周铺展开来。AVM环视系统——鱼眼相机去畸变算法 - 知乎。

大胡子大叔的专栏 2万+

ES6 Proxy 与 Reflect 详解

本文深入探讨了ES6的Proxy和Reflect API,介绍了它们的基本概念、使用方法及实际应用场景。Proxy可以拦截对象的基本操作,通过handler定义代理行为;Reflect则提供了与Proxy对应的原生方法。文章详细解析了各种陷阱方法(如属性访问、函数调用等)的使用方式,并展示了如何将两者配合使用实现数据验证、日志记录等功能。最后列举了多个实际应用案例,包括响应式系统、API拦截、自动重试机制等,同时也指出了性能考虑和使用注意事项。这些特性为JavaScript提供了强大的元编程能力,可以实现更

油墨香^-^的博客 497

ArcGIS Pro 3.4 二次开发 - 知识图谱

本文介绍了在ArcGIS Pro SDK 3.4和.NET 8环境下操作知识图谱的方法。主要包含两大功能模块:1) 知识图谱数据存储操作,包括建立连接、获取图层、检索要素类与表定义、ID转换等;2) 知识图谱数据模型管理,如获取数据模型属性、标识符信息等。代码示例详细展示了如何使用C#通过QueuedTask异步任务与知识图谱服务交互,包括异常处理、数据转换等常见操作场景。所有示例均采用using语句确保资源释放,并遵循ArcGIS Pro SDK的最佳实践。

Winemonk 762

Proxy和Reflect内容详解

ES6中的Proxy和Reflect内容详解 监听对象的操作 我们先来看一个需求:有一个对象,我们希望监听这个对象中的属性被设置或获取的过程 通过我们前面所学的知识,能不能做到这一点呢? 其实是可以的,我们可以通过之前的属性描述符中的存储属性描述符来做到; 监听对象的操作:下面这段代码就利用了前面讲过的 Object.defineProperty 的存储属性描述符来对属性的操作进行监听。 const obj={ name:'liu', age:21 } Object.keys(obj).for

酒客的博客 656

在 FreeStyle SAP UI5 应用里优雅落地 Draft 草稿机制:用 DraftManager 封装 DraftController 的一套实战套路

SAP Fiori应用中,Draft草稿机制是解决业务中断、多人协作和长表单填写等痛点的核心能力。本文提出了一套针对FreeStyle SAP UI5应用的Draft管理方案,通过封装sap.ui.generic.app.transaction.DraftController为DraftManager服务类,将复杂的草稿操作逻辑集中管理。该方案实现了草稿的创建、激活、丢弃等核心功能,使控制器只需调用简单意图式API即可完成操作,同时解决了组件化架构下的上下文切换、统一错误处理等问题。文章还详细介绍了后端Dr

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2750

HDMI接口及其在编程中的应用

在编程中,我们可以使用HDMI接口来控制和管理连接到计算机的HDMI设备。本文将介绍HDMI接口的基本原理以及如何在编程中使用HDMI接口。在编程中,我们可以使用HDMI接口来控制和管理连接到计算机的HDMI设备。本文介绍了HDMI接口的基本原理,并提供了使用Python编程语言和相关库实现HDMI接口应用的示例代码。我们可以使用编程语言提供的音频库来生成和播放音频,并将其通过HDMI接口输出到连接的设备上。我们可以使用编程语言提供的音频库来生成和播放音频,并将其通过HDMI接口输出到连接的设备上。

CodeByte的博客 802

ES6中Proxy和Reflect的理解和用法

原文链接: ES6中Proxy和Reflect的理解和用法 ...

阿豪 131

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

ECMAScript 6 学习系列课程 (ES6 proxy和Reflect的相关用法)

使用Javascript ES6的Proxy实现元编程, 如果你熟悉Java,这非常类似Java中的动态代理模式,在ES6中Proxy, Reflect实现了代理和反射机制,这样说大家可能比较生涩,我们还是看一下具体代码:let target = { foo: "Welcome, foo" } let proxy = new Proxy(target, { get (receiver

天外野草技术专栏 2629

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

es6 proxy代理与reflect拦截简单用法

有疑问欢迎评论,作者将及时回复与讨论。 //例子1 var target = { a:1, b:undefined } var p = new Proxy(target,{ }); p.a = 2; // 操...

wy的博客 292

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

ES6 Reflect 与 Proxy

概述:Proxy 与 Reflect 是 ES6 为了操作对象引入的 API。Proxy 可以对目标对象的读取、函数调用等操作进行拦截,然后进行操作处理。它不直接操作对象,而是像代理模式,通过对象的代理对象进行操作,在进行这些操作时,可以添加一些需要的额外操作。Reflect 可以用于获取目标对象的行为,它与 Object 类似,但是更易读,为操作对象提供了一种更优雅的方式。它的方法与 Proxy 是对应的。

qq_74472152的博客 418

Proxy和Reflect

转自:https://www.cnblogs.com/huansky/p/5687299.html Proxy概述 Proxy用于修改某些操作的默认行为,等同于在语言层面做出修改,所以属于一种“元编程”(meta programming),即对编程语言进行编程。 Proxy可以理解成,在目标对象之前架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截,因此提供了一种

zhanglir333的博客 1702

es6 Reflect 与 Proxy

Proxy 与 Reflect 是 ES6 为了操作对象引入的 API 。 Proxy 可以对目标对象的读取、函数调用等操作进行拦截,然后进行操作处理。它不直接操作对象,而是像代理模式,通过对象的代理对象进行操作,在进行这些操作时,可以添加一些需要的额外操作。 Reflect 可以用于获取目标对象的行为,它与 Object 类似,但是更易读,为操作对象提供了一种更优雅的方式。它的方法与 Proxy...

小志的博客 717

ES6 Reflect 映射

Reflect 的13种静态方法说明。实例 ES6 Proxy和Reflect 的观察者模式。

颜良文丑的博客 481

JS的Proxy、Reflect的理解和使用

即监听obj与代理对象objProxy的set操作都监听到了,通过receiver改变obj中get与set方法中的this指向。但是Object作为一个构造函数,实际上很多操作都放到Object上并不合适,所以ES6新增Reflect来集成这些操作。①可以看到我们是可以通过跟这个方法监听到的,但是,对这个对象新增、删除对象属性的操作时,我们是监听不到的;Reflect提供了很多JavaScript的对象的方法,有点像Object操作对象的方法;操作的都是obj对象的代理对象objProxy。

weixin_47342624的博客 630

ES6(五)——ES6 Reflect 与 Proxy

Proxy 与 Reflect 是 ES6 为了操作对象引入的 API。Proxy 可以对目标对象的读取、函数调用等操作进行拦截,然后进行操作处理。它不直接操作对象,而是像代理模式,通过对象的代理对象进行操作,在进行这些操作时,可以添加一些需要的额外操作。Reflect 可以用于获取目标对象的行为,它与 Object 类似,但是更易读,为操作对象提供了一种更优雅的方式。它的方法与 Proxy 是对应的。

m0_62701594的博客 1338

【HarmonyOS NEXT鸿蒙系统相关应用开发ECMAScript6(ES6)开发基础教程】-第8课时-3.1.2 ES6 Reflect 与 Proxy

Proxy 与 Reflect 是 ES6 为了操作对象引入的 API。Proxy 可以对目标对象的读取、函数调用等操作进行拦截,然后进行操作处理。它不直接操作对象,而是像代理模式,通过对象的代理对象进行操作,在进行这些操作时,可以添加一些需要的额外操作。Reflect 可以用于获取目标对象的行为,它与 Object 类似,但是更易读,为操作对象提供了一种更优雅的方式。它的方法与 Proxy 是对应的。

xzs51job的专栏 808

ES6+ Proxy与Reflect使用

ES6+ Proxy与 Reflect 使用 说明 Proxy 译为 “代理器”,用于修改某些操作的默认行为,可以认为是在目标对象|函数之前架设一层“拦截”,外接的访问,都必须通过这层拦截,这层拦截中可以对外接的访问进行过滤和改写 1. 基本语法 target 指被代理的目标对象或函数 handler 定制的用来拦截外界操作行为的对象 traps 对应外界操作的拦截方法 ...

mjzhang1993的博客 422

ES6 入门—ES6 Reflect 与 Proxy,一起刷完了这份1307页的前端面试宝典吧

资料过多,篇幅有限自古成功在尝试。不尝试永远都不会成功。勇敢的尝试是成功的一半。用于设置目标对象的 prototype。示例代码:// true在终端使用 node 命令运行:十一、apply 方法的使用等同于。func 表示目标函数;thisArg 表示目标函数绑定的 this 对象;args 表示目标函数调用时传入的参数列表,可以是数组或类似数组的对象。若目标函数无法调用,会抛出 TypeError。示例代码:// 5。

2401_87298532的博客 430
上一篇: jQuery ajaxError参数 详细整理
下一篇: ES6 箭头函数用法和案例
JarunWang
博客等级 码龄18年 57粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值