ES6代理器Proxy简介
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.foo
和proxy['foo']
。 - set(target, propKey, value, receiver):拦截对象属性的设置,比如
proxy.foo = v
或proxy['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简介相关推荐
- 代理模式(Proxy)简介
代理模式相对来讲比较简单和容易理解. 一, 代理模式(Proxy)的定义 教材里定义很简单: 所谓代理模式, 就是为其他对象提供一种代理控制对这个对象的访问. 上面出现了3个名词: 1.其他对象 2. ...
- es6 Proxy 简介
Proxy 简介 Proxy 用于修改某些操作的默认行为,等同于在语言层面做出修改,所以属于一种"元编程"(meta programming),即对编程语言进行编程. Proxy ...
- Proxy用法——让我们创建一个API代理器
什么是Java Proxy? MDN对Proxy 的定义是: Proxy对象用于定义基本操作的自定义行为(如属性查找.赋值.枚举.函数调用等). 通俗的将,Proxy对象是目标对象的一个代理器,任何对 ...
- Javascript基础:代理器(proxy)
一.proxy的概念 Proxy 可以理解成,在目标对象之前架设一层"拦截",外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写.Prox ...
- 人人都会设计模式---代理模式--Proxy
教程大纲 版权声明:本文为博主原创文章,未经博主允许不得转载 PS:转载请注明出处 作者: TigerChain 地址: www.jianshu.com/p/1b3b6b003- 本文出自 Tiger ...
- 05、人人都会设计模式:代理模式--Proxy
PS:转载请注明出处 作者: TigerChain 地址: http://www.jianshu.com/p/1b3b6b003032 本文出自 TigerChain 简书 人人都会设计模式 教程简介 ...
- 【ES6】阮一峰ES6学习(六) Proxy
Proxy 1. 前言 2. 使用 3. Proxy 实例方法 1. get()方法 2. set()方法 3. apply()方法 4. 为什么要存在Proxy? 两者对比 1. 前言 es6中全新 ...
- JAVA开发的23种设计模式之 — 装饰器模式 代理器模式
装饰器模式 概述 : 动态的给一个对象添加一些额外的职责,就增加功能来说,装饰器模式相比生成子类更加灵活 维基百科解释 : 通过使用修饰模式,可以在运行时扩充一个类的功能.原理是 :增加一个修饰类包裹 ...
- Nginx 反向代理工作原理简介与配置详解
Nginx 反向代理工作原理简介与配置详解 测试环境 CentOS 6.8-x86_64 nginx-1.10.0 下载地址:http://nginx.org/en/download.html 安装 ...
最新文章
- 你有哪些deep learning(rnn、cnn)调参的经验?
- 一文详解激光雷达感知方案
- IO异常 java.net.SocketException: Connection reset
- centos7下没有iptables
- python接入微信公众号_Python学习之微信公众号接入 一 验证
- 查看oracle 的数据文件的版本信息
- ELK的What files do you want me to watch? Exiting: no modules or inputs enabled and configuration
- Python正则表达式如何进行字符串替换实例
- 前端学习(2979):vue-element-admin结构always:true始终显示
- zabbix3.2学习笔记(二):服务端安装
- 用python祝福父亲节_父亲节到来 最适合给年老的父亲祝福语
- oracle 回滚空间查询,Oracle回滚段空间回收步骤
- Mac 使用Quik Time Player为iPhone录屏后, iPhone状态条时间变为9:41
- 学会 配置文件+反射,走遍全球都不怕.
- PR常用的效果和转场,视频防抖、宽银幕效果、设置默认效果
- 二阶采样matlab程序,Sea-clutter-simulation 海杂波仿真程序,包括单基地雷达和双 的一阶、二阶 matlab 272万源代码下载- www.pudn.com...
- python如何取消上一步操作的快捷键_ai返回上一步的快捷键是什么
- 2021-02-14马克思主义概论
- JAVA中list根据某个字段排序
- 闭式系统蒸汽管径推荐速度_暖通设计常用参考数据1
热门文章
- 浅谈CSDN博客在Google中的收录
- 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数
- JAVA 完成一个网页计算器
- 【21天学习挑战】经典算法之【冒泡排序】
- 苹果选择ARM架构的cpu背后的“野心”和“理想”
- MapReduce编程之求每个学生的最高成绩及对应科目(使用GroupingComparator和SortComparator)
- hive 中的case when嵌套与if用法实战
- 5-13 九宫格输入法 (15分)
- 文献阅读(166)鲲鹏
- 基于Python的Solidworks二次开发小尝试(一)