每天3分钟,重学ES6-ES12(十九)Proxy-Reflect(一)

简介: 每天3分钟,重学ES6-ES12(十九)Proxy-Reflect

19c2e7a9bfbb7f5e8c7d744db995e29.png

每天3分钟,重学ES6-ES12文章汇总

监听对象的操作

  • 我们先来看一个需求:有一个对象,我们希望监听这个对象中的属性被设置或获取的过程
  • 通过我们前面所学的知识,能不能做到这一点呢?
  • 其实是可以的,我们可以通过之前的属性描述符中的存储属性描述符来做到;
  • 这段代码就利用了前面讲过的 Object.defineProperty 的存储属性描述符来对 属性的操作进行监听。
const obj = {
  name: "why",
  age: 18
}
Object.defineProperty(obj, "name", {
   get: function() {
     console.log("监听到obj对象的name属性被访问了")
   },
   set: function() {
     console.log("监听到obj对象的name属性被设置值")
   }
})
  • 但是这样做有什么缺点呢?
  • 首先,Object.defineProperty设计的初衷,不是为了去监听截止一个对象中所有的属性的。
  • 我们在定义某些属性的时候,初衷其实是定义普通的属性,但是后面我们强 行将它变成了数据属性描述符。
  • 其次,如果我们想监听更加丰富的操作,比如新增属性、删除属性,那么 Object.defineProperty是无能为力的。
  • 所以我们要知道,存储数据描述符设计的初衷并不是为了去监听一个完整的对象。

Proxy基本使用

  • 在ES6中,新增了一个Proxy类,这个类从名字就可以看出来,是用于帮助我们创建一个代理的:
  • 也就是说,如果我们希望监听一个对象的相关操作,那么我们可以先创建一个代理对象(Proxy对象);
  • 之后对该对象的所有操作,都通过代理对象来完成,代理对象可以监听我们想要对原对象进行哪些操作;
  • 我们可以将上面的案例用Proxy来实现一次:
  • 首先,我们需要new Proxy对象,并且传入需要侦听的对象以及一个处理对象,可以称之为handler;
  • const p = new Proxy(target, handler)
  • 其次,我们之后的操作都是直接对Proxy的操作,而不是原有的对象,因为我们需要在handler里面进行侦听;

Proxy的set和get捕获器

  • 如果我们想要侦听某些具体的操作,那么就可以在handler中添加对应的捕捉器(Trap):
  • set和get分别对应的是函数类型;
  • set函数有四个参数:
  • target:目标对象(侦听的对象);
  • property:将被设置的属性key;
  • value:新属性值;
  • receiver:调用的代理对象;
  • get函数有三个参数:
  • target:目标对象(侦听的对象);
  • property:被获取的属性key;
  • receiver:调用的代理对象;

代码展示

const obj = {
  name: "why",
  age: 18
}
const objProxy = new Proxy(obj, {
  // 获取值时的捕获器
  get: function(target, key) {
    console.log(`监听到对象的${key}属性被访问了`, target)
    return target[key]
  },
  // 设置值时的捕获器
  set: function(target, key, newValue) {
    console.log(`监听到对象的${key}属性被设置值`, target)
    target[key] = newValue
  }
})

Proxy所有捕获器

  • 13个捕捉器分别是做什么的呢?
handler.getPrototypeOf()
    Object.getPrototypeOf 方法的捕捉器。
handler.setPrototypeOf()
    Object.setPrototypeOf 方法的捕捉器。
handler.isExtensible()
    Object.isExtensible 方法的捕捉器。
handler.preventExtensions()
    Object.preventExtensions 方法的捕捉器。
handler.getOwnPropertyDescriptor()
    Object.getOwnPropertyDescriptor 方法的捕捉器。
handler.defineProperty()
    Object.defineProperty 方法的捕捉器。
handler.ownKeys()
    Object.getOwnPropertyNames 方法和Object.getOwnPropertySymbols 方法的捕捉器。
handler.has()
    in 操作符的捕捉器。
handler.get()
    属性读取操作的捕捉器。
handler.set()
    属性设置操作的捕捉器。
handler.deleteProperty() 
    delete 操作符的捕捉器。
handler.apply()
    函数调用操作的捕捉器。
handler.construct()
    new 操作符的捕捉器。

Proxy的construct和apply

当然,我们还会看到捕捉器中还有construct和apply,它们是应用于函数对象的:

function foo() {
}
const fooProxy = new Proxy(foo, {
  apply: function(target, thisArg, argArray) {
    console.log("对foo函数进行了apply调用")
    return target.apply(thisArg, argArray)
  },
  construct: function(target, argArray, newTarget) {
    console.log("对foo函数进行了new调用")
    return new target(...argArray)
  }
})
fooProxy.apply({}, ["abc", "cba"])
new fooProxy("abc", "cba")


相关文章
|
2月前
|
缓存 JavaScript 数据安全/隐私保护
js开发:请解释什么是ES6的Proxy,以及它的用途。
`ES6`的`Proxy`对象用于创建一个代理,能拦截并自定义目标对象的访问和操作,应用于数据绑定、访问控制、函数调用的拦截与修改以及异步操作处理。
26 3
|
9月前
|
前端开发
前端学习笔记202306学习笔记第四十一天-Es6-proxy得使用2
前端学习笔记202306学习笔记第四十一天-Es6-proxy得使用2
23 0
|
5月前
es6中proxy如何使用
es6中proxy如何使用
26 0
|
8月前
ES6: Proxy概念及用法
ES6: Proxy概念及用法
25 0
|
9月前
|
前端开发
前端学习笔记202306学习笔记第四十一天-Es6-proxy得使用1
前端学习笔记202306学习笔记第四十一天-Es6-proxy得使用1
32 0
|
11月前
|
JavaScript 前端开发 API
每天3分钟,重学ES6-ES12(十九)Proxy-Reflect(二)
每天3分钟,重学ES6-ES12(十九)Proxy-Reflect
44 0
|
11月前
|
缓存 JavaScript 算法
每天3分钟,重学ES6-ES12(十八) CJS
每天3分钟,重学ES6-ES12(十八) CJS
65 0
|
11月前
|
前端开发 JavaScript
每天3分钟,重学ES6-ES12系列文章汇总
每天3分钟,重学ES6-ES12系列文章汇总
40 0
|
11月前
|
JavaScript 前端开发
每天3分钟,重学ES6-ES12(十八)ES Module(一)
每天3分钟,重学ES6-ES12(十八)ES Module
54 0
|
11月前
|
JavaScript 前端开发
每天3分钟,重学ES6-ES12(十八)ES Module(二)
每天3分钟,重学ES6-ES12(十八)ES Module
55 0