概述
不直接跟目标进行交互,跟代理进行交互。
代理:提供了修改底层实现的方式(比如:属性的修改和赋值)
这就要求,必须把底层实现写成API。
如何创建代理?
/**
* 代理一个目标对象
* target 目标对象
* handler 是一个普通对象,其中可以重写底层实现(参照反射那一章的API)
* 返回一个代理对象
*/
new Proxy(target, handler)
举例:
const obj = {
a: 1,
b: 2
}
const proxy = new Proxy(obj, {
set(target, propertyKey, value) {
// console.log(target, propertyKey, value);
// target[propertyKey] = value;
Reflect.set(target, propertyKey, value);
},
get(target, propertyKey) {
if (Reflect.has(target, propertyKey)) {
return Reflect.get(target, propertyKey);
} else {
return -1;
}
},
has(target, propertyKey) {
return false;
}
});
我们可以通过set重写底层实现; 我们不能重写目标对象的底层实现,但是我们能重写代理的底层实现;为什么这样设计呢?如果让我们重写目标对象的底层实现,容易把对象搞得乱七八糟,所以,在外面套一个代理,只操作代理。