首页 > 其他分享 >Proxy是什么?

Proxy是什么?

时间:2023-03-19 22:13:04浏览次数:36  
标签:objProxy console log 对象 什么 Object Proxy

现在国内的两大框架:vue、react。对于这两个框架,相信大家多多少少都接触过,对于vue而言,有一个很重要的特点,那就是响应式。vue2的响应式采用的是ES5的Object.defineproperty对数据进行劫持。而vue3则是采用ES6的Proxy对数据进行劫持。想要了解vue3的响应式就必须了解Proxy。

一、Proxy的认识
Proxy是ES6新增的,它是一个类,是用于帮助我们创建一个代理对象,如果我们需要监听对象的操作,那么我们可以通过Proxy先创建一个代理对象,之后对该对象的所有操作都通过代理来完成。他与Object.defineProperty最大的区别就在于Object.defineProperty直接监听对象的属性,proxy是监听整个代理对象。

二、Proxy的基本使用

创建一个对象

const obj = {
name:'cj',
age:18
}
再创建Proxy代理对象

const objProxy = new Proxy(obj,{})
参数一:需要代理的对象

参数二:捕获器,对代理对象的属性进行访问、赋值等操作的时候触发,与Object.defineproperty的存取描述符类似。如果为空对象,就只有set、get这两个默认捕获器,并且不会有过多的操作,get捕获器就直接返回访问属性的值,set捕获器就将新的值赋值给访问属性。

示例:

const objProxy = new Proxy(obj,{})

console.log(objProxy.name) //'cj'
console.log(objProxy.age) //18

objProxy.name = 'wx'
objProxy.age = 20

//对代理对象操作后,代理对象就会对原对象进行操作
console.log(obj.name) //'wx'
console.log(obj.age) //20
注意:Proxy只能代理对象(Object、Function、Array),非对象值无法进行代理。Proxy也只能够代理对象的基本操作,无法代理对象的复合操作。什么是基本操作?什么又是复合操作?

const obj = {
name:'cj',
bar(){
console.log('bar')
}
}
const objProxy = new Proxy(obj,{})

function foo() { console.log('foo') }
const fooProxy = new Proxy(foo,{
apply(){ //apply是对函数调用进行拦截
//...
}
})

objProxy.name; //基本操作
fooProxy(); //基本操作

objProxy.bar() //复合操作

上面访问代理对象的属性、调用函数就是基本操作。调用对象里的方法就是复合操作,它可以分为两步:第一步是访问对象的方法,第二步是调用该方法。

三、Proxy捕获器的使用
Proxy捕获器用来对代理对象属性进行访问、赋值等操作时的一个捕获。与Object.defineproperty的存取描述符类似。下面我们就认识一下常用的四个捕获器的基本使用。

const objProxy = new Proxy(obj,{
//get操作符
get:function(target,key){
console.log(`监听到访问${key}属性`,target)
return target[key] //返回访问属性的值
},
//set操作符
set:function(target,key,newValue){
console.log(`监听到给${key}属性设置值`,target)
tarset[key] = newValue //将属性最新值,赋值给代理对象属性
}
//has操作符
has:function(target,key){
console.log(`监听到使用in操作符${key}`,target)
return key in target
}
//delete操作符
deleteProperty:function(){
console.log(`监听到使用delete操作符${key}`,target)
delete target[key]
}
})

console.log(objProxy.name)
console.log(objProxy.age)

objProxy.name = 'wx'
objProxy.age = 20

//in操作符
console.log('name' in objProxy) //true
//delete操作符
delete objProxy.name

Proxy的13种捕获器:
handler.get():属性读取操作的捕捉器。
handler.set():属性设置操作的捕捉器。
handler.has():in 操作符的捕捉器。
handler.deleteProperty():delete 操作符的捕捉器。
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.apply():函数调用操作的捕捉器。(函数也是一个对象,这里就对函数调用时进行监听)
handler.construct():new 操作符的捕捉器。(函数执行new操作符的时候进行监听)
总结:
Proxy除了set、get捕获器能监听对象属性,还有其它的操作符,一共有13种。
使用Proxy创建的代理对象进行操作的好处是,可以不用直接通过Object.defineproperty去操作原对象,通过Object.defineproperty直接操作原对象就会将对象原本的数据属性描述符变成了访问属性描述符
Object.defineproperty没有类似于has、deleteProperty等这样的捕获器,只有存取属性描述符(set、get)

标签:objProxy,console,log,对象,什么,Object,Proxy
From: https://www.cnblogs.com/Godfather-twq/p/17234524.html

相关文章

  • 全链路压测(4):全链路压测的价值是什么?
    转载:https://www.cnblogs.com/imyalost/p/15777351.html在前面的几篇文章中,介绍了全链路压测的背景、在企业中的立项流程以及落地的一些技术方案。在开始真正的介绍落地......
  • 什么是DevOps
       DevOps是产品开发过程中开发(Dev)和运营(Ops)团队之间的灰色区域。DevOps 就是开发(Development)、测试(QA)、运维(Operations)这三个领域的合并。DevOps是一种软件开发方法......
  • CAS 是一种什么样的同步机制?多线程下为什么不使用 int 而使用 AtomicInteger?
    CompareAndSwap,比较交换。可以看到synchronized可以保证代码块原子性,很多时候会引起性能问题,volatile也是个不错的选择,但是volatile不能保证原子性,只能在某些场合下使......
  • 谈谈什么是微服务?
    微服务架构的系统是一个分布式的系统,按业务进行划分为独立的服务单元,解决单体系统的不足,同时也满足越来越复杂的业务需求。单体架构存在的不足在小型应用的初期,访问量小......
  • 什么是着色器编译以及为什么它会使 PC 游戏卡顿?
    由于每台PC的GPU都不一样,为了让游戏运行在不同品牌和型号的显卡上,shader编译是必不可少的。不幸的是,编译过程会导致烦人的卡顿。有些游戏有一种卡顿现象,无论您的计算机......
  • 熟悉JVM吗?为什么新生代内存需要有两个Survivor区?
    在JVM的新生代内存中,为什么除了Eden区,还要设置两个Survivor区?为什么要有Survivor区如果没有Survivor,Eden区每进行一次MinorGC,存活的对象就会被送到老年代。老年代很快被......
  • 什么是scrum中的3355?
    Scrum是由KenSchwaber和JeffSutherland在1990年创建的主流敏捷技术,它是用于开发、交付和持续支持复杂产品的一个框架。它是最受欢迎的敏捷技术,超过50%以上的项目在运用这......
  • 我们说StringBuilder是线程不安全的,是什么原因呢?
    在Java中字符串属于对象,Java提供了String类来创建和操作字符串。String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,这样不仅效率低下,而且大量浪......
  • 二、什么时OpenGL
    *OpenGL即OpenGraphicsLibrary,它是一个由Khronos组织指定并维护的规范(Specification)*OpenGL核心是一个c库,同时也支持多种语言的派生 1、固定管线模式(3.2) 2......
  • msvcr120.dll丢失是什么意思?msvcr120.dll文件丢失修复方法
    msvcr120.dll是干嘛的?msvcr120.dll是vs2010编译的程序默认的库文件它的丢失易导致游戏、应用软件等程序运行出现错误,致使程序无法正常运行,今天小编把自测解决缺少msvcr120.d......