es6学习之Proxy & Reflect

一.Proxy

1.概述

(1)概念

Proxy是拦截,代理的意思,即在目标对象前架设一层拦截.

(2)注意

  • proxy想要生效,必须在proxy实例上进行相应的操作
  • proxy内部的this指向proxy实例而不是目标对象,要注意

2.Proxy实例方法(13种)

(1)get(target,propKey,receiver),拦截对象的读取属性proxy.foo或者proxy[‘foo’]

(2)set(target,propKey,propValue,receiver),拦截目标对象的赋值,如proxy.foo = ‘a’; 或者 proxy[‘foo’] = ‘a’;

(3)has(target,propKey),拦截foo in proxy操作,返回Boolean

(4)deleteProperty(target,propKey),拦截delete proxy[propKey]

(5)ownKeys(target),拦截Object.getPropertyNames(proxy),Object.getPropertySymbols(proxy),Object.keys(proxy)操作,返回数组

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

(7)defineProperty(target,propKey,propDesc),拦截Object.defineProperty(proxy,propKey,propDesc)或者Object.defineProperties(proxy,Descs),返回Boolean

(8)preventExtensions(target),拦截Object.preventExtensions(proxy),返回Boolean值

(9)isExtensible(target),拦截Object.isExtentsible(proxy),返回Boolean值

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

(11)setPrototypeOf(target,proto),拦截Object.setPrototypeOf(proxy,proto),返回Boolean,如果目标对象是函数,还有额外2中操作可以拦截

(12)apply(target,object,args),拦截proxy作为函数调用的操作.比如proxy(…args),proxy.call(object,…args),apply(…)

(13)construct(target,args),拦截Proxy实例作为构造函数的操作,例如new proxy(…args);

Proxy.revocable(),返回一个能取消proxy的实例

let target = {};
let handler = {};

let {proxy, revoke} = Proxy.revocable(target, handler);

proxy.foo = 123;
proxy.foo // 123

revoke();
proxy.foo // TypeError: Revoked

二.Reflect

1.概述

(1)概念

Reflect意为反射,不同于Java的反射机制

(2)设计目的

  • 将一些Object上的方法部署到Reflect上
  • 修改一些不合理的方法的行为
  • 让Object操作变为函数操作,而不是命令操作
  • 和Proxy方法上的方法一一对应,可用Reflect完成默认的操作,然后在使用Proxy代理其他的行为

2.静态方法

一一对应于上面proxy的方法,不一一介绍了,参考:
http://es6.ruanyifeng.com/#docs/reflect#%E9%9D%99%E6%80%81%E6%96%B9%E6%B3%95

3.使用Reflect实现观察者模式

var person = {
    name:'申玉超',
    age:123
};

function print() {
    console.log(`${person.name},${person.age}`);
}


const queuedObservers = new Set();

const observe = fn => queuedObservers.add(fn);
const observable = obj => new Proxy(obj, {set});

function set(target, key, value, receiver) {
  const result = Reflect.set(target, key, value, receiver);
  queuedObservers.forEach(observer => observer());
  return result;
}



observe(print);
var proxyPerson = observable(person);
proxyPerson.name = '李四';
// 李四,123

proxyPerson.age = 456;
// 李四,456
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!关于"vue3proxy结合reflect"的问题,我理解你可能想了解如何在Vue 3中使用Proxy与Reflect结合起来。Vue 3是一个流行的JavaScript框架,而Proxy和Reflect则是ES6中新增的特性。 在Vue 3中,可以使用Proxy对象来代理Vue实例,以便捕获对数据的访问和修改。Proxy对象可以拦截并处理对Vue实例的操作,比如读取、设置和删除属性等。而Reflect对象提供了一组用于操作对象的方法,比如Reflect.get()、Reflect.set()和Reflect.deleteProperty()等。 结合使用Proxy和Reflect可以提供更灵活的控制和监控能力。你可以通过在Vue实例上创建一个代理对象,来拦截对数据的访问和修改,并在代理处理器中使用Reflect方法来操作实际的数据。这样可以轻松地实现对数据的拦截、校验、代理等功能。 下面是一个简单的示例代码,展示了如何在Vue 3中使用Proxy和Reflect结合起来: ```javascript const data = { message: 'Hello, Vue!', }; const proxy = new Proxy(data, { get(target, key) { console.log('Getting ' + key); return Reflect.get(target, key); }, set(target, key, value) { console.log('Setting ' + key + ' to ' + value); return Reflect.set(target, key, value); }, }); // 创建Vue应用 const app = Vue.createApp({ data() { return proxy; // 使用代理对象 }, }); app.mount('#app'); ``` 在上面的代码中,我们创建了一个名为data的普通对象,并使用Proxy对象创建了一个代理对象proxy。在代理对象的get和set处理器中,我们分别使用Reflect.get和Reflect.set来操作实际的数据。这样,当我们通过Vue实例访问或修改数据时,会触发代理处理器,并通过Reflect方法操作实际的数据。 希望这个例子能帮助到你,如果还有其他问题,请随时提问!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值