vue.js

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript类库 > vue.js > VUE2—defineProperty和VUE3—proxy

VUE2—defineProperty和VUE3—proxy使用方式

作者:Cshaosun

Vue2和Vue3的响应式原理不同,Vue2使用Object.defineProperty,Vue3使用Proxy,Object.defineProperty可以监听某个属性,但不能监听整个对象,且无法监听对象属性的新增和删除,Proxy可以监听整个对象,且不会修改原数据,可以监听数组的长度变化

前言

使用过vue开发的盆友都知道Vue2和Vue3的响应式原理是不一样的,vue2用的是Object.definePropertyvue3用的是proxy。那他们具体是什么呢?又有什么区别呢?

下面叫我简单做个笔记。有什么错误望各位大佬不吝指点。

什么是Object.defineProperty()

Object.defineProperty是 es5 引入的一个方法,用于定义或修改对象的属性的方法,可以控制属性的特性(如可枚举性、可配置性、可写性等)。

Object.defineProperty()语法

Object.defineProperty(obj, prop, descriptor)

参数说明:

descriptor 对象下包含的属性:

<script>

// 定义一个对象名为(person)的对象【对象的属性有(name、sex)】
let person = { name: '小明', sex: '男'}


//给对象(person)添加一个属性名为(age)的属性,属性描述符只包含了 value 属性,表示 age 属性的初始值。
Object.defineProperty(person, 'age', {
    value: 18,         // 属性的值 
    enumerable: true,  // 属性是否可枚举
    writable: true,    // 属性是否可写/可修改
    configurable: true // 属性是否可以被删除
})
 
console.log(person);

</script>

proxy简介

Proxy是ES6中的一种用于创建代理对象的特殊对象。它允许我们定义自定义行为,例如拦截和修改对象的默认操作。Proxy可以用于拦截对象的各种操作,包括属性访问、赋值、函数调用等。

Proxy构造函数接受两个参数目标对象(被代理的对象)和一个处理器对象(用于定义拦截器)

常用的拦截方法包括:getsetapplyconstruct、deletePropertyhasgetOwnPropertyDescriptor等。【这些拦截方法会在代理对象进行对应操作时自动触发

注:Proxy详解见我另一篇文章: ES6之---Proxy简介 这里就不过多叙述了

// 写法:target是目标对象,handler是处理器对象
const proxy = new Proxy(target, handler);

简单示例

let star = {
name: '小明',
age: 18
}
let proxy = new Proxy(star,{
    get(targetObj, propoty, receiver) {
        console.log(`我是被代理的对象${targetObj}`)
        console.log(`我是你访问的被代理的属性${propoty}`)
        //receiver是代理对象proxy
        return targetObj[propoty]
    }
})

vue中defineProperty和proxy对比

1.监听数据的角度

2.监听对原对象的影响

3.实现对数组的监听

4. 监听的范围

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文