基于 Proxy 的数据代理

先上代码

//首先定义对象
let data = {
    name: "mt",
    age: 8,
    price: 9000
}

//  let proxy = new Proxy(target, handler);
//	target 是用Proxy包装的被代理对象(可以是任何类型的对象,包括原生数组,函数,甚至另一个代理)
//	handler 是一个对象,其声明了代理target 的一些操作,其属性是当执行一个操作时定义代理的行为的函数。

let proxyData = new Proxy(data,{
	// 方法用来处理获取数据时的劫持行为
    get(target,key){
        if(key == "price"){
            return target[key]*.9;
        }
        return target[key];
    },
    // 方法用来处理设置数据时的劫持行为
    set(target,key,newVal){ 
        target[key] = newVal;
    },

});
console.log(proxyData);

基于 Proxy 的数据代理

let proxy = new Proxy(target, handler);

  • target 是用Proxy包装的被代理对象(可以是任何类型的对象,包括原生数组,函数,甚至另一个代理)
  • handler 是一个对象,其声明了代理target 的一些操作,其属性是当执行一个操作时定义代理的行为的函数。

handler 对象的方法

get(target,key[,receiver])

get 方法用来处理获取数据时的劫持行为

set(target,key,newValue[,receiver])

set 方法用来处理设置数据时的劫持行为

has(target,key)

has 方法用来处理在判断是否有该属性时的劫持行为
return true 存在该属性,false 不存在该属性

apply(target, thisArg, argumentsList)

apply 方法用来代理函数的执行,要求 target 必须是一个函数

construct(target, argumentsList)

construct 方法用于拦截 new 操作符.

defineProperty(target, property, descriptor)

defineProperty 方法用于拦截 defineProperty 操作
return Object.defineProperty

deleteProperty(target, property)

deleteProperty 用于拦截对象属性的删除操作

getOwnPropertyDescriptor(obj, key)

getOwnPropertyDescriptor 方法用于拦截 getOwnPropertyDescriptor 操作
getOwnPropertyDescriptor 必须返回一个 object 或 undefined

Object.getOwnPropertyDescriptor() 方法返回指定对象上一个自有属性对应的属性描述符

getPrototypeOf(target)

getPrototypeOf 用于拦截对象调用 getPrototypeOf 方法

Object.getPrototypeOf 查找对象的原型方法

setPrototypeOf(target,prototype)

setPrototypeOf 方法主要用来拦截 Object.setPrototypeOf().

Object.setPrototypeOf 设置对象的原型方法

isExtensible(target)

isExtensible 用于拦截对象的isExtensible方法

不可扩展对象
- Object.preventExtensions(obj) 阻止对象扩展
- Object.freeze(obj) 冻结对象
- Object.isExtensible() 判断对象是否可以扩展

preventExtensions(target)

preventExtensions 用于拦截 Object.preventExtensions

ownKeys(target)

ownKeys 会拦截一下操作:
Object.keys()

最后vue3中的源码就是利用Proxy 实现数据响应式的

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值