You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Proxy 用于修改某些操作的默认行为,被称为 powerful meta programming,有很多强大的用处,如拦截(intercept),重载(overload),VUE3 的响应式(reactivity)系统构建等.有了 Proxy 可以实现很多神奇的功能。
The Proxy object is used to define custom behavior for fundamental operations (e.g. property lookup, assignment, enumeration, function invocation, etc).–MDN
const target = {
msg: "Felix",
};
const handler1 = {};
const proxy1 = new Proxy(target, handler1);
console.log(proxy1.msg); // Felix
console.log(target.msg); // Felix
proxy1.msg = 'Felix Cao, update after set proxy1';
console.log(proxy1.msg); // Felix Cao, update after set proxy1'
console.log(target.msg); // Felix Cao, update after set proxy1'
Proxy
用于修改某些操作的默认行为,被称为powerful meta programming
,有很多强大的用处,如拦截(intercept
),重载(overload
),VUE3
的响应式(reactivity
)系统构建等.有了Proxy
可以实现很多神奇的功能。JavaScript
的新标准ECMAScript
语法越来越规范,之前的一些坑,新的标准规范也开始慢慢填,加上babel
的普及使用,我们可以多多拥抱新语法、特性,简洁代码,愉悦自己。一、基础语法
ES6
原生提供Proxy
构造函数,用来生成Proxy
实例。Proxy
构造函数接受两个参数,target
和handler
,target
表示所要拦截的目标对象,handler
对象表示定制的拦截行为ES6
原生的Proxy
构造器创建的Proxy
实例对象名称为proxy
,简单的说Proxy
构造器产生了他的实例对象proxy
;二、拦截行为配置对象不作为 {}
跑一把上面的代码看一看
handler1
,是一个空对象,对Proxy
对象的proxy1
的操作,本质上是对原始目标对象target
的操作三、拦截 get 操作
get
方法用于拦截对象属性的读取操作,如proxy.foo和proxy['foo']。可以接受三个参数,依次为目标对象、属性名和proxy
实例本身(严格地说,是操作行为所针对的对象),其中最后一个参数可选。3.1、拦截对象的所有属性
proxy2
对象中的所有属性的访问,都被handler2
配置的get
拦截,这肯定不是我们期望的。跑一把上面的代码看一看
3.2、拦截指定的属性
proxy3
对象的除name
属性以外的都返回undefined
, 这是个bug
跑一把上面的代码看一看
利用
Reflect.get
仅拦截指定的属性---修复2.2的bug
, 即在 if 条件表达式后下面的代码即可跑一把
3.3. 拦截处理异常
跑一把
3.4. 拦截数组
Proxy
可以直接操作数组跑一把
Reference
The text was updated successfully, but these errors were encountered: