Open PaulChess opened 3 years ago
引言
ES6新增的代理和反射为开发者提供了拦截并向基本操作嵌入额外行为的能力。具体来说,可以给目标对象定义一个关联的代理对象,而这个代理对象可以作为抽象的目标对象来使用。在对目标对象的各种操作影响到目标对象之前,可以在代理对象中对这些操作加以控制。 由于代理是一种新的基础性语言能力,很多转译程序都不能把代理行为转换为之前的ECMASCRIPT代码,因为代理的行为是无法替代的。为此,代理和反射只在百分之百支持它们的平台使用(即需要确保兼容性)。可以检测代理是否存在,不存在则提供兜底代码。不过这样做会导致代码冗余,因此并不推荐。
9.1 代理基础 --摘自红宝书
代理是目标对象的抽象。从很多方面看 ,代理类似c++指针,因为它可以用做目标对象的替身,但又完全独立于目标对象。目标对象既可以直接被操作,也可以通过代理来操作,但直接操作会绕过代理施予的行为(即捕获器)。
9.2 代理捕获器与反射方法 --摘自红宝书
代理可以捕获13种不同的基本操作。这些操作有各自不同的反射API方法、参数、关联ECMAScript操作和不变式。 正如前面示例所展示的,有几种不同的JavaScript操作会调用同一个捕获器处理程序。不过,对于在代理对象上执行的任何一种操作,只会有一个捕获处理程序被调用,不会存在重复捕获的情况。 只要在代理上调用,所有捕获器都会拦截它们对应的反射API操作。
9.3 代理模式 --摘自红宝书
使用代理可以在代码中实现一些有用的编程模式 主要介绍了
跟踪属性访问
、隐藏属性
、属性验证
、函数与构造函数参数验证
、数据绑定与可观察对象
小结
proxy开辟了js元编程及抽象的新天地。 从宏观上看,代理是真实js对象的透明操作层。代理可以定义包含捕获器的处理程序对象。而这些捕获器可以拦截绝大部分js的基本操作和方法。在这个捕获器处理程序中,可以修改任何基本操作的行为,前提是遵从
捕获器不变式
。 与代理如影随形的反射API,封装了一整套与捕获器拦截的操作相对应的方法。可以把反射API看成一套基本操作。 代理的应用场景不可限量,开发者使用它可以创建出各种编码模式,比如跟踪属性访问
、隐藏属性
、阻止修改或删除属性
、函数参数验证
、构造函数参数验证
、数据绑定
以及可观察对象
等等...
面试官:Vue3.0里为什么要用 Proxy API 替代 defineProperty API ?
参考答案链接: https://vue3js.cn/interview/vue3/proxy.html#%E4%B8%80%E3%80%81object-defineproperty
有空一定要自己梳理一遍。
有空看一下proxy的相关文章:
proxy基础学习记录