Proxy 意思为代理,即在访问对象之前建立一道拦截,任何访问该对象的操作之前都会通过这道拦截。
Proxy可以拦截什么
getPrototypeOf()setPrototypeOf()isExtensible()preventExtensions()getOwnPropertyDescriptor()defineProperty()has()get()set()deleteProperty()ownKeys()apply()construct()
实例
Proxy 语法
1 | let proxy = new Proxy(target, handler); |
这就是Proxy的使用方法,所有的用法都是上面的方法,不同的是handler里面拦截的设置
new Proxy()表示生成一个Proxy实例
target表示要拦截的目标对象
handler是一个对象,用来定制拦截方法
想要handler里的拦截方法生效,后续所有操作必须使用Proxy的实例
get
get方法在日常开发中应该是使用最多的方法了,先看一下在不使用Proxy时候的场景
1 | let user = { |
上面代码中,使用let定义了一个对象,并且有一个name属性
然后分别打印出name和age属性,结果很明显,age属性未定义会输出undefined
但是在实际项目中我们是不希望返回undefined这种值给页面的,下面我们就看一下怎么使用Proxy解决这个问题
1 | let handler = { |
使用了Proxy之后,发现和之前什么都不一样了,这是因为我们设置了get方法的拦截,当获取name属性的时候,我们返回一个固定的值,否则就返回年龄18。
这里是不太严谨的,实际项目中不可能只有两个字段的,这里只是为了演示
想要handler里的拦截方法生效,后续所有操作必须使用Proxy的实例
这个时候可以验证一下这句话,我们不使用Proxy实例,看看会怎么样
set
在实际项目中,我们会经常进行修改某个对象的属性,有时候在一些特殊的场景下需要对对象修改的新属性进行判断,看是否符合当前的业务场景。
1 | let user = new Proxy( |
当我们修改一个人的年龄大于140,就会触发异常
construct
construct方法用于拦截new操作符,为了使new操作符在生成的Proxy对象上生效,用于初始化代理的目标对象自身必须具有Construct内部方法
示例
1 | let proxy = new Proxy(1, { |
1 |
|
上面是两个错误的示例,下面写一个正确的写法
1 | var p = new Proxy(function() {}, { |
通过以上代码得出结论
- 要代理的对象必须具有
Construct方法 - 必须返回一个对象
其他
其他方法下一章继续