new Proxy()代理

Proxy 这个词的原意是代理,可以理解成,在目标对象之前架设一层“拦截”,外界对该目标对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写。

let proxy = new Proxy(target,handler);

Proxy对象由两个部分组成:target、handler

  • target:目标对象
  • handler:是一个对象,声明了代理target的指定行为,支持的拦截操作,一共13种:

- get(target,propKey,receiver):拦截对象属性的读取。

set(target,propKey,value,receiver):拦截对象属性的设置,返回一个布尔值(修改成功)。

- has(target,propKey):拦截 propKey in proxy 的操作,返回一个布尔值。

deleteProterty(target,propKey):拦截delete proxy[propKey]的操作,返回一个布尔值。

ownKeys(target):拦截Object.getOwnPropertyNames(proxy)、Object.getOwnPropertySymbols(proxy)、Object.keys(proxy)、for...in 循环,返回一个数组。该方法返回目标对象所有自身的属性的属性名,而Object.keys()的返回结果仅包括目标对象自身的可遍历属性。

- getOwmPropertyDescript(target,propKey):拦截Object.getOwnPropertyDescriptor(proxy,propKey),返回属性的描述对象。

defineProperty(target,propKey,propDesc):拦截Object.defineProperty(proxy,propKey,propDesc)、Object.defineProperties(proxy,propDesc),返回一个布尔值。

preventExtensions(target):拦截Object.preventExtensions(proxy),返回一个布尔值。

getPrototypeOf(target):拦截Object.getPrototypeOf(proxy),返回一个对象。

isExtensible(target):拦截Object.isExtensible(proxy),返回一个布尔值。

setPrototypeOf(target,proto): 拦截Object.setPrototypeOf(proxy,proto),返回一个布尔值。如果目标对象是函数,那么还有两种额外操作可以拦截。

apply(target,object,args):拦截Proxy实例作为函数调用的操作,比如proxy(...args)、proxy.call(object,...args)、proxy.apply(...)。

construct(target,args):拦截Proxy实例作为构造函数调用的操作,比如:new proxy(...args)。

拦截方法

target

(目标)

propKey

(属性)

value

(值)

receiver

(proxy实例本身)

propDesc

(属性描述)

proto

(原型)

object

(目标对象的上下文对象this)

args

(参数)

newTarget

(new 命令作用的构造函数)

get      
set     
has       
deleteProperty       
ownKeys        
getOwnProperty       
defineProperty      
preventExtensions        
getPrototypeOf        
isExtensible        
setPrototypeOf       
apply      
construct      

例子:

var obj = new Proxy({}, {
  get: function (target, propKey, receiver) {
    console.log(`getting ${propKey}!`);
    return Reflect.get(target, propKey, receiver);
  },
  set: function (target, propKey, value, receiver) {
    console.log(`setting ${propKey}!`);
    return Reflect.set(target, propKey, value, receiver);
  }
});

obj.count = 1
//  setting count!
++obj.count
//  getting count!
//  setting count!
//  2

 

 

 

 

  • 5
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 3中引入了Proxy作为响应式系统的核心,它可以用于代理对象并拦截其属性的访问。通过使用Proxy,我们可以更加灵活地对数据进行监听和响应。 在Vue 3中,使用Proxy代理的步骤如下: 1. 创建一个普通的JavaScript对象作为数据源。 2. 使用`new Proxy(target, handler)`创建一个代理对象,其中`target`是要代理的对象,`handler`是一个包含拦截器方法的对象。 3. 在`handler`对象中定义拦截器方法,例如`get`、`set`、`deleteProperty`等。这些方法会在对代理对象进行相应操作时被调用。 4. 将代理对象作为Vue实例的数据源。 下面是一个简单的示例代码,演示了如何使用Proxy代理对象: ```javascript // 创建一个普通的JavaScript对象作为数据源 const data = { name: 'John', age: 25 }; // 使用Proxy创建代理对象 const proxy = new Proxy(data, { get(target, key) { console.log(`访问了属性 ${key}`); return target[key]; }, set(target, key, value) { console.log(`设置了属性 ${key} 的值为 ${value}`); target[key] = value; } }); // 将代理对象作为Vue实例的数据源 const app = Vue.createApp({ data() { return { person: proxy }; } }); // 在Vue模板中使用代理对象的属性 app.mount('#app'); ``` 在上述示例中,我们创建了一个普通的JavaScript对象`data`作为数据源,并使用Proxy创建了代理对象`proxy`。在代理对象的`get`和`set`方法中,我们分别打印了访问和设置属性的信息,并对原始对象进行了相应的操作。最后,将代理对象作为Vue实例的数据源,并在Vue模板中使用了代理对象的属性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值