Proxy概述

Proxy 用于修改某些操作的默认行为,等同于在语言层面做出修改,所以属于一种“元编程”(meta programming),即对编程语言进行编程。

Proxy 可以理解成,在目标对象之前架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写。Proxy 这个词的原意是代理,用在这里表示由它来“代理”某些操作,可以译为“代理器”。

Proxy用法

const proxy = new Proxy(target, handler);  // new Proxy()表示生成一个Proxy实例,target参数表示所要拦截的目标对象,handler参数也是一个对象,用来定制拦截行为。

Proxy支持的拦截操作

参数说明:target指目标对象, propKey指属性名称,receiver指Proxy实例

  • get(target, propKey, receiver):拦截对象属性的读取,比如proxy.fooproxy['foo']
  • set(target, propKey, value, receiver):拦截对象属性的设置,比如proxy.foo = vproxy['foo'] = v,返回一个布尔值。
  • has(target, propKey):拦截propKey in proxy的操作,返回一个布尔值。
  • deleteProperty(target, propKey):拦截delete proxy[propKey]的操作,返回一个布尔值。
  • ownKeys(target):拦截Object.getOwnPropertyNames(proxy)Object.getOwnPropertySymbols(proxy)Object.keys(proxy)for...in循环,返回一个数组。该方法返回目标对象所有自身的属性的属性名,而Object.keys()的返回结果仅包括目标对象自身的可遍历属性。
  • getOwnPropertyDescriptor(target, propKey):拦截Object.getOwnPropertyDescriptor(proxy, propKey),返回属性的描述对象。
  • defineProperty(target, propKey, propDesc):拦截Object.defineProperty(proxy, propKey, propDesc)Object.defineProperties(proxy, propDescs),返回一个布尔值。
  • preventExtensions(target):拦截Object.preventExtensions(proxy),返回一个布尔值。
  • getPrototypeOf(target):拦截Object.getPrototypeOf(proxy),返回一个对象。
  • isExtensible(target):拦截Object.isExtensible(proxy),返回一个布尔值。
  • setPrototypeOf(target, proto):拦截Object.setPrototypeOf(proxy, proto),返回一个布尔值。如果目标对象是函数,那么还有两种额外操作可以拦截。
  • apply(target, object, args):拦截 Proxy 实例作为函数调用的操作,比如proxy(...args)proxy.call(object, ...args)proxy.apply(...)
  • construct(target, args):拦截 Proxy 实例作为构造函数调用的操作,比如new proxy(...args)

Proxy.revocable()

Proxy.revocable方法返回一个可取消的 Proxy 实例。

let target = {};
let handler = {};let {proxy, revoke} = Proxy.revocable(target, handler);proxy.foo = 123;
proxy.foo // 123revoke();
proxy.foo // TypeError: Revoked

Proxy.revocable方法返回一个对象,该对象的proxy属性是Proxy实例,revoke属性是一个函数,可以取消Proxy实例。上面代码中,当执行revoke函数之后,再访问Proxy实例,就会抛出一个错误。

Proxy.revocable的一个使用场景是,目标对象不允许直接访问,必须通过代理访问,一旦访问结束,就收回代理权,不允许再次访问。

this 问题

虽然 Proxy 可以代理针对目标对象的访问,但它不是目标对象的透明代理,即不做任何拦截的情况下,也无法保证与目标对象的行为一致。主要原因就是在 Proxy 代理的情况下,目标对象内部的this关键字会指向 Proxy 代理。

const target = {m: function () {console.log(this === proxy);}
};
const handler = {};const proxy = new Proxy(target, handler);target.m() // false
proxy.m()  // true

ES6代理器Proxy简介相关推荐

  1. 代理模式(Proxy)简介

    代理模式相对来讲比较简单和容易理解. 一, 代理模式(Proxy)的定义 教材里定义很简单: 所谓代理模式, 就是为其他对象提供一种代理控制对这个对象的访问. 上面出现了3个名词: 1.其他对象 2. ...

  2. es6 Proxy 简介

    Proxy 简介 Proxy 用于修改某些操作的默认行为,等同于在语言层面做出修改,所以属于一种"元编程"(meta programming),即对编程语言进行编程. Proxy ...

  3. Proxy用法——让我们创建一个API代理器

    什么是Java Proxy? MDN对Proxy 的定义是: Proxy对象用于定义基本操作的自定义行为(如属性查找.赋值.枚举.函数调用等). 通俗的将,Proxy对象是目标对象的一个代理器,任何对 ...

  4. Javascript基础:代理器(proxy)

    一.proxy的概念 Proxy 可以理解成,在目标对象之前架设一层"拦截",外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写.Prox ...

  5. 人人都会设计模式---代理模式--Proxy

    教程大纲 版权声明:本文为博主原创文章,未经博主允许不得转载 PS:转载请注明出处 作者: TigerChain 地址: www.jianshu.com/p/1b3b6b003- 本文出自 Tiger ...

  6. 05、人人都会设计模式:代理模式--Proxy

    PS:转载请注明出处 作者: TigerChain 地址: http://www.jianshu.com/p/1b3b6b003032 本文出自 TigerChain 简书 人人都会设计模式 教程简介 ...

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

    Proxy 1. 前言 2. 使用 3. Proxy 实例方法 1. get()方法 2. set()方法 3. apply()方法 4. 为什么要存在Proxy? 两者对比 1. 前言 es6中全新 ...

  8. JAVA开发的23种设计模式之 —  装饰器模式 代理器模式

    装饰器模式 概述 : 动态的给一个对象添加一些额外的职责,就增加功能来说,装饰器模式相比生成子类更加灵活 维基百科解释 : 通过使用修饰模式,可以在运行时扩充一个类的功能.原理是 :增加一个修饰类包裹 ...

  9. Nginx 反向代理工作原理简介与配置详解

    Nginx 反向代理工作原理简介与配置详解 测试环境 CentOS 6.8-x86_64 nginx-1.10.0 下载地址:http://nginx.org/en/download.html 安装 ...

最新文章

  1. 你有哪些deep learning(rnn、cnn)调参的经验?
  2. 一文详解激光雷达感知方案
  3. IO异常 java.net.SocketException: Connection reset
  4. centos7下没有iptables
  5. python接入微信公众号_Python学习之微信公众号接入 一 验证
  6. 查看oracle 的数据文件的版本信息
  7. ELK的What files do you want me to watch? Exiting: no modules or inputs enabled and configuration
  8. Python正则表达式如何进行字符串替换实例
  9. 前端学习(2979):vue-element-admin结构always:true始终显示
  10. zabbix3.2学习笔记(二):服务端安装
  11. 用python祝福父亲节_父亲节到来 最适合给年老的父亲祝福语
  12. oracle 回滚空间查询,Oracle回滚段空间回收步骤
  13. Mac 使用Quik Time Player为iPhone录屏后, iPhone状态条时间变为9:41
  14. 学会 配置文件+反射,走遍全球都不怕.
  15. PR常用的效果和转场,视频防抖、宽银幕效果、设置默认效果
  16. 二阶采样matlab程序,Sea-clutter-simulation 海杂波仿真程序,包括单基地雷达和双 的一阶、二阶 matlab 272万源代码下载- www.pudn.com...
  17. python如何取消上一步操作的快捷键_ai返回上一步的快捷键是什么
  18. 2021-02-14马克思主义概论
  19. JAVA中list根据某个字段排序
  20. 闭式系统蒸汽管径推荐速度_暖通设计常用参考数据1

热门文章

  1. 浅谈CSDN博客在Google中的收录
  2. 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数
  3. JAVA 完成一个网页计算器
  4. 【21天学习挑战】经典算法之【冒泡排序】
  5. 苹果选择ARM架构的cpu背后的“野心”和“理想”
  6. MapReduce编程之求每个学生的最高成绩及对应科目(使用GroupingComparator和SortComparator)
  7. hive 中的case when嵌套与if用法实战
  8. 5-13 九宫格输入法 (15分)
  9. 文献阅读(166)鲲鹏
  10. 基于Python的Solidworks二次开发小尝试(一)