理解es6系列-----【proxy和refection】----未完待续

es6-proxy-polyfill:ES6 Proxy polyfill,支持IE8 +,Node.js等 | 英语 ES6代理Polyfill 这是ES6 Proxy的polyfill,支持IE6 + ,Node.js等。 到目前为止,它比GoogleChrome的支持更多功能。 polyfill仅支持有限数量的代理“陷阱”: 得到 放 申请 构造 还支持Proxy.revocable方法,但仅适用于对上述陷阱的调用。 安装 npm i - S es6 - proxy - polyfill 用法 浏览器: <!--[if lte IE 8]> [removed][removed] <![endif]--> < script src =" path/to/es6-proxy-polyfill.js " type =" text/javascript " > < 立即下载

什么是proxy和refection

  • 通过 new Proxy()可 生成一个proxy来代替目标对象(target object)来使用。它等于目标对象的虚拟化,对于使用了该proxy的方法而言,二者看起来是一样的。通过proxy可以一窥原来只能由js引擎完成的底层操作。
  • reflection API 是以Reflect对象为代表的的一组方法,为同级的底层操作提供proxy可以重写的默认行为。每个proxy trap都有Reflect方法。
Proxy TrapOverrides the Behavior OfDefault Behavior
getReading a property valueReflect.get()
setWriting to a propertyReflect.set()
hasThe in operatorReflect.has()
deletePropertyThe delete operatorReflect.deleteProperty()
getPrototypeOfObject.getPrototypeOf()Reflect.getPrototypeOf()
setPrototypeOfObject.setPrototypeOf()Reflect.setPrototypeOf()
isExtensibleObject.isExtensible()Reflect.isExtensible()
preventExtensionsObject.preventExtensions()Reflect.preventExtensions()
getOwnPropertyDescriptorObject.getOwnPropertyDescriptor()Reflect.getOwnPropertyDescriptor()
definePropertyObject.defineProperty()Reflect.defineProperty
ownKeysObject.keys, Object.getOwnPropertyNames(), Object.getOwnPropertySymbols()Reflect.ownKey()
applyCalling a functionReflect.apply()
constructCalling a function with newReflect.construct()

生成一个新的简单proxy

  • 传入两个参数,目标对象和句柄 (target and handler)。
  • 句柄(handler),就是一个定义了一个或多个“陷阱”(trap)的对象。
  • proxy在做没有定义陷阱的其他操作时,使用默认的行为。此时二者的表现是相同的,操作proxy就等于操作target。
let target = {};

let proxy = new Proxy(target, {});

proxy.name = "proxy";
console.log(proxy.name);        // "proxy"
console.log(target.name);       // "proxy"

target.name = "target";
console.log(proxy.name);        // "target"
console.log(target.name);       // "target"

用set陷阱来验证属性

set 陷阱接受4个参数:

  1. trapTarget
  2. key 对象的key,字符或者symbol,重写的就是这个属性啦
  3. value 赋予这个属性的值
  4. receiver 操作在哪个对象上发生,receiver就是哪个对象,通常就是proxy。
let target = {
    name: "target"
};

let proxy = new Proxy(target, {
    set(trapTarget, key, value, receiver) {
        // ignore existing properties so as not to affect them
        if (!trapTarget.hasOwnProperty(key)) {
            if (isNaN(value)) {
                throw new TypeError("Property must be a number.");
            }
        }
        console.table(Reflect)
        // add the property
        return Reflect.set(trapTarget, key, value, receiver);
    }
});

// adding a new property
proxy.count = 1;   // 这时trapTarget就是target,key等于count,value 等于1, receiver 是 proxy本身
console.log(proxy.count);       // 1
console.log(target.count);      // 1

// you can assign to name because it exists on target already
proxy.name = "proxy";
console.log(proxy.name);        // "proxy"
console.log(target.name);       // "proxy"

// throws an error
proxy.anotherName = "proxy";
  • new Proxy 里,传入的第二个参数即为handler,这里定义了set方法,对应的内部操作是Reflect.set(),同时也是默认操作。
  • set proxy trap 和 Reflect.set() 接收同样的四个参数
  • Reflect.set() 返回一个boolean值标识set操作是否成功,因此,如果set了属性,trap会返回true,否则返回false。

用get陷阱来验证对象结构(object shape)

object shape: 一个对象上可用的属性和方法的集合。

与很多其他语言不通,js奇葩的一点在于,获取某个不存在的属性时,不会报错,而是会返回undefined。在大型项目中,经常由于拼写错误等原因造成这种情况。那么,如何用Proxy的get方法来避免这一点呢?

使用Object.preventExtensions(), Object.seal(), Object.freeze() 等方法,可以强迫一个对象保持它原有的属性和方法。现在要使每次试图获取对象上不存在的属性时抛出错误。在读取属性时,会走proxy。.get()接收3个参数。

  1. trapTarget
  2. key: 属性的键。一个字符串或者symbol。
  3. receiver

比起上面的set,少了一个value。Reflect.get()方法同样接收这3个参数,并返回属性的默认值。

let proxy = new Proxy({}, {
    get(trapTartet, key, receiver) {
        if(!(key in receiver)) {
            throw new TypeError(`property ${key} doesn't exist`)
        }
        return Reflect.get(trapTarget, key, recevier)
    }
})

// adding a property still works
proxy.name = "proxy";
console.log(proxy.name);            // "proxy"

// nonexistent properties throw an error
console.log(proxy.nme);             // 识别出了拼写错误,并throws error

用has陷阱来隐藏属性

  • 使用in操作符会使has陷阱被调用。它接收两个参数trapTarget和key
  • 内部的Refelct.has()接收同样的2个参数。可以修改其返回的默认值。
let target = {
    name: "target",
    value: 42
};

let proxy = new Proxy(target, {
    has(trapTarget, key) {

        if (key === "value") {
            return false;
        } else {
            return Reflect.has(trapTarget, key);
        }
    }
});


console.log("value" in proxy);      // false
console.log("name" in proxy);       // true
console.log("toString" in proxy);   // true

deleteProperty 来阻止属性被删除

  • delete操作符移除一个对象上的属性,并返回一个boolean标识操作是否成功。
  • 严格模式下,试图删除一个nonconfigurable属性(不可改)会抛出错误;非严格模式下则返回false。
let target = {
    name: 'target',
    value: 42
}

Object.defineProperty(target, 'name', { configurable: false})

const res = delete target.name // 如果严格模式会抛出错误
console.log(res)   // false
console.log('name' in target)  //true
  • delete 操作对应的是deleteProperty 陷阱。它接收2个参数, trapTarget 和 key。
let proxy = new Proxy(target, {
    deleteProperty(trapTarget, key) {

        if (key === "value") {
            return false;
        } else {
            return Reflect.deleteProperty(trapTarget, key);
        }
    }
});

getPrototypeOf 和 setPrototypeof

  • setPrototypeOf陷阱接收两个参数, trapTarget 和 proto。如果操作不成功,必须返回false。
  • getPrototypeOf陷阱接收一个参数,就是trapTarget。必须返回一个对象或者null。否则会跑错误。
  • 对改写这两个函数的限制保证了js语言中Object方法的一致性。
//通过一直返回null隐藏了target的原型,同时不允许修改其原型
let target = {}
let proxy = new Proxy(target, {
    getPrototypeOf(trapTarget) {
        return null
    }
    setPrototyoeof(trapTarget, proto) {
        return false
    }
})

let targetProto = Object.getPrototypeOf(target)
let proxyProto = Object.getPrototypeOf(proxy)

console.log(targetProto === Object.prototype)   //true
console.log(proxyProto === Object.prototype)    //false
console.log(proxyProto)                         //null

//succeeds
Object.setPrototypeOf(target, {})

// throw error
Object.setPrototypeOf(proxy, {})   
  • 如果要用默认行为,直接调用Reflect.getPrototypeOf/setPrototypeOf, 而不是调用Object.getPrototypeOf/setPrototypeOf。这样做是有原因的,两者的区别在于:
  1. Object上的方法是高层的,而Refect上的方法是语言底层的。
  2. Refeclt.get/setPrototypeOf()方法其实是把内置的[[GetPrototypeOf]]操作包装了一层,做了输入校验。
  3. Object上的这两个方法其实也是调用内置的[[GetPrototypeOf]]操作,但在调用之前还干了些别的,并且检查了返回值,来决定后续行为。
  4. 比如说,当传入的target不是对象时,Refeclt.getPrototypeOf()会抛出错误,而Object.getPrototypeOf会强制转换参数到对象,再继续操作。有兴趣的童鞋不妨传个数字进去试试~
  5. 如果操作不成功,Reflect.setPrototypeOf()会返回一个布尔值来标识操作是否成功,而如果Object.setPrototypeOf()失败,则会直接抛错。前者的返回false 其实就会导致后者的抛错。

结论

Reflect是跟Object同级的一个js数据类型。一个类。
介绍了基本的api。本质是重写方法。meta编程。

参考文献:

  1. understanding es6: proxies and reflections
VM虚拟机下,通过无线,有线两种方式连接PLC的设置方法 1,VMware软件:编辑>虚拟网络编辑器。 2.右下角:更改设置(如果可以选中“添加网络”选项,则可考虑略过此步) 3.选中VMnet0,点击桥接模式,选中你的物理机有线网卡。点击确定。 4.点击添加网络,我的添加完是VMnet2,然后选中,像上一步样,点击桥接模式,在下拉菜单中选中笔记本的【无线网卡】,然后点击确定。 5.VMware软件:虚拟机>设置。 6.点击 添加>网络... 阅读详情

相关推荐

第八章 MobileNetv3网络详解

本文介绍了基于互补的搜索技术和新颖的架构设计的MobileNets的下一代。MobileNetV3通过硬件感知网络架构搜索(NAS)和NetAdapt算法相结合,针对移动电话CPU进行优化,随后通过新颖的架构改进技术进行了进一步提高。本文开始探索自动化搜索算法和网络设计如何相互协作,以利用互补的方法改进整体技术水平。通过此过程,我们创建了两个新的MobileNet模型:MobileNetV3-Large和MobileNetV3-Small,分别针对高资源和低资源使用情况。

ADICDFHL的博客 1万+

深入理解ES6笔记(十一)代理(Proxy)和反射(Reflection)API(12)

主要知识点:代理和反射的定义、常用的陷阱函数、可被撤销的代理、将代理对象作为原型使用、将代理作为类的原型 《深入理解ES6》笔记 目录 代理与反射 代理是什么? 通过调用 new Proxy() ,你可以创建一个代理用来替代另一个对象(被称之为目目标对象) ,这个代理对目标对象进行了虚拟,因此该代理与该目标对象表面上可以被当作同一个对象...

weixin_33708432的博客 241

Windows下玩转Spark:零基础本地集群搭建与实战演示

本文详细介绍了在Windows系统下零基础搭建Spark本地集群的完整流程,包括环境准备、集群启动、实战案例演示及性能优化技巧。通过Standalone模式快速部署,结合WordCount等经典案例帮助初学者快速掌握Spark数据处理,特别适合Windows环境下的大数据开发入门学习。

weixin_33734785的博客 423

【ES6】阮一峰ES6学习(六) Proxy

es6中全新设计了一个叫的类型,Proxy这个词的原意是代理,用在这里表示由它来”代理“某些操作,可以译为”代理器“,Proxy就是专门为对象设置访问代理器的,无论是读还是写都要经过代理,通过proxy就能轻松监视对象的读写过程。如何使用监视对象的读写过程呢?定义一个对象,对象当中有一个属性和属性,然后通过的方式为创建一个代理对象的构造函数需要2个参数,一个是需要代理的目标对象,另一个是代理的处理对象,在这个处理对象中可以通过方法监视对象属性的访问,通过方法监视对象设置属性的过程 1. get()方法 ge

GY的博客 7128

LabVIEW机器视觉通用软件

LabVIEW 通用视觉一款仿C模式的思想与方法 全网最精简零基础+通用视觉全套视频教程 只想把LabVIEW当作一种兴趣,结果却当成了职业 http://t.elecfans.com/c1181.html 本次(开源 )针对有一定视觉基础或项目开发经验的工程师量身打造视觉通用性系统(完全仿面向对象的原理),相对于一般的非标框架更具功能性,有效的解决复杂项目开发过程中的思路瓶颈。 LabVIEW通用视觉系统:通用软件可快速解决大部分简单的视觉开发项目,帮助众多软件工程师解决在非标视觉软件开发中的繁琐过程问

qq_21516871的博客 4609

gmsv源代码c语言,石器时代ABLua的原理、简介、过程、运用、收发

操作原理(一)服务端:服务器源文件客户端:客户所操作的程序(既是游戏客户端)接口:既是某项功能(例如:鼠标点击,文字发送,战斗,观战,人物动作等)返回的值ABlua:在源代码中添加的整套引擎作为回调接口--lua所实现的功能是基于服务端源码添加的接口由该接口与客户端发送封包实现功能源码里是否有ABlua回调接口?例如:源码里的gmsv/battle.c文件(既是战斗回调文件)以下为简单描述C给予l...

weixin_35223575的博客 2408

ES6之主要知识点(十)Proxy

Proxy 用于修改某些操作的默认行为,等同于在语言层面做出修改,所以属于一种“元编程”(meta programming),即对编程语言进行编程。 Proxy 可以理解成,在目标对象之前架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制, 可以对外界的访问进行过滤和改写。Proxy 这个词的原意是代理,用在这里表示由它来“代理”某些操作,可以译为“代理器”。 ...

weixin_34067980的博客 991

SAP CBC 集成质量系统初始化接入实战指南

摘要 本文探讨了SAP S/4HANA Cloud Public Edition项目中质量系统的初始接入过程。质量系统并非开箱即用,而是需要经过SAP Central Business Configuration(CBC)的Scope and Organizational Structure阶段部署后才能具备完整功能。文章重点分析了几个关键环节:CBC里程碑确认的时机选择、Identity Authentication的初始管理员设置、Business Role Template的创建规范等。实施过程中需特

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

ES6之Proxy详解

ES6中的Proxy是一种用于创建代理对象的特殊对象。它允许我们定义自定义行为,例如拦截和修改对象的默认操作。Proxy可以用于拦截对象的各种操作,包括属性访问、赋值、函数调用等。 Proxy的作用是在目标对象之前架设一层拦截,可以对目标对象进行各种操作的拦截和自定义处理。通过使用Proxy,我们可以实现对目标对象的访问控制、数据验证、属性劫持等功能。

俊刚的博客 3466

解析AI人工智能领域AI芯片的散热技术

当你用ChatGPT写代码、用AI生成高清图片时,背后的AI芯片可能正在“发高烧”——全球TOP500超算的平均功耗已突破10兆瓦,单颗GPU的峰值功耗超过700W(相当于3台家用空调同时运行)。本文将聚焦AI芯片的散热技术,覆盖从基础原理到前沿方案的全链条解析,帮助读者理解“散热为什么比算力更重要”。

AIGC应用创新大全的博客 934

华为FusionCompute之计算虚拟化

华为FusionCompute之虚拟化

jks212454的博客 2452

ES6 Proxy 详解:语法、作用、场景应用示例

Proxy 是 ES6 新增的一项重要功能,它提供了一种创建对象代理的方式,允许你定义额外的行为来拦截和改写对目标对象的常规操作。Proxy 可以监听并过滤掉对对象的访问、属性赋值、方法调用等操作。

大剑师兰特的GIS世界 2877

SAP-ABAP:SAP信贷管理核心:CL_UKM_BUPA_FACTORY类完整解析与实践指南

SAP信贷管理核心类CL_UKM_BUPA_FACTORY解析 CL_UKM_BUPA_FACTORY是SAP信贷管理(UKM)模块的核心类,作为业务伙伴信贷数据的中央控制台,它提供: 统一入口:标准化实例化客户/供应商信贷对象 主要功能: 获取单条/批量业务伙伴数据 安全保存数据变更 封装底层数据访问逻辑 典型应用场景: 信贷主数据批量维护 自动化限额调整 订单信贷实时检查 性能优化建议: 使用批量方法替代循环单条处理 合理设置字段选择 实施缓存策略 该类通过简洁API简化复杂信贷操作,是SAP信贷管理开

baidu_35680696的博客 1208

ES6 之 Proxy 介绍

Proxy(代理) 是 ES6 中新增的一个特性。Proxy 让我们能够以简洁易懂的方式控制外部对对象的访问。其功能非常类似于设计模式中的代理模式。 使用 Proxy 的好处是:对象只需关注于核心逻辑,一些非核心的逻辑(如:读取或设置对象的某些属性前记录日志;设置对象的某些属性值前,需要验证;某些属性的访问控制等)可以让 Proxy 来做。从而达到关注点分离,降级对象复杂度的目的。 使用方法 ...

大灰狼的小绵羊哥哥的博客 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

ES6 中的 Proxy 全面讲解

Proxy 是 ES6 引入的一个强大功能,意思是“代理”。它可以用来拦截对象的操作,并在操作时进行自定义的逻辑处理。

2301_81137804的博客 1293

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

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

ES6学习系列——Proxy

Proxy用于修改某些操作的默认行为,等于是在语言层面做出了修改,也就是对编程语言进行改动。具体来说,Proxy就是一种机制,用来拦截外界对目标对象的访问,可以对这些访问进行过滤或者改写,所以Proxy更像是目标对象的代理器。 1、ES6 原生提供Proxy构造函数,可以用来生成proxy实例: (1)实例 let proxy = new Proxy(target, handler)...

Troyes 的自我修养记录 1268

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

ES6的代理模式 | Proxy

定义: 用于定义基本操作的自定义行为proxy修改的是程序默认形为,就形同于在编程语言层面上做修改,属于元编程(meta一段代码来理解元编程这段程序每执行一次能帮我们生成一个名为program的文件,文件内容为1024行echo,如果我们手动来写1024行代码,效率显然低效:与手工编写全部代码相比,程序员可以获得更高的工作效率,或者给与程序更大的灵活度去处理新的情形而无需重新编译proxy。

lbking666666的专栏 379

猿创征文|一文带你深入掌握ES6 Proxy数据代理

在ES6之前,我们常使用方法Vue2的响应式原理)而在ES6之后诞生了一个全新的对象Proxy,作为数据代理而言,它比要强大许多,这也是为什么Vue3的响应式要使用Proxy来做的原因这篇文章将深入去研究Proxy代理,让我们开始吧!深入了解了Proxy之后,真的会被它强大的代理拦截功能所折服,在它的基础上我们可以创建几乎任何我们想要的响应式系统,它像是一个硕大的地基,至于地基之上需要建筑什么,全由我们自己掌握!...

前端之行,任重道远! 1万+

ES6 什么是proxy

Proxy是一个非常重要的特性,它可以帮助我们更好地控制对象的行为,从而实现一些高级的功能。:目标对象,即被Proxy包装的对象。:处理器对象,定义了拦截行为的方法。

m0_72759446的博客 369

es:proxy(拦截器)

Proxy 可以理解成,在目标对象之前架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写。Proxy 这个词的原意是代理,用在这里表示由它来“代理”某些操作,可以译为“代理器”。 var obj = new Proxy({}, { get: function (target, propKey, receiver) { console.log(`getting ${propKey}!`); return Reflect.get(t

qq_43470725的博客 1176

ES6 Proxy兼容polyfill实现

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34216196的博客 4634

【亲测免费】 ES6 Proxy Polyfill 使用指南

ES6 Proxy Polyfill 是一个旨在提供对 ES6 中 Proxy 对象支持的垫片库。当环境不原生支持 ES6 的 Proxy 特性时,此库能够使开发者在旧版本浏览器或环境中也能利用 Proxy 的强大功能进行对象的虚拟化操作,如拦截属性访问、修改、删除等。本项目由 GoogleChrome 团队维护,保障了其高质量和广泛的兼容性。 ## 项目快速启动 要迅速开始使用 `proxy...

gitblog_00076的博客 685

es6:proxy

es6:proxy Proxy 是 ES6 中新增的功能,它可以用来自定义对象中的操作。 target 代表需要添加代理的对象,handler 用来自定义对象中的操作,比如可以用来自定义 set 或者 get 函数。 使用演示: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-...

qq_44891434的博客 428

ES6中的proxy是什么,该如何使用?

ES6引入了代理(Proxy)作为一种元编程机制,它允许我们拦截并自定义目标对象的操作。本文将介绍ES6中代理的基本概念,并提供代理的实例代码和解释。

alive_new的博客 523

弹出弹窗后,如何禁止底层的body滚动,适用于超长的页面

常见场景 从event target入手 还是直接干body吧 conclusion 常见场景 在许多填写表单的页面中,都会弹出一个选择器,让你在弹窗中选择项目。有时,弹窗本身容纳不下内容,需要让它不断滚动来展示,但因为事件是冒泡的,有时就会造成底部(body 的Z-index肯定是在下面的 )的内容也在滚动。这内外一起滚,就有点尴尬了。 举例,下面两张图里,都有类似的问题。那

凝视深渊 4万+
上一篇: 微信position: fixed的坑及解决之道
下一篇: 页面的生命周期API及给开发者的建议------来自谷歌开发者博客
十方魔
博客等级 码龄10年 202粉丝 93原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值