代理和反射-Proxy(代理)

292 阅读1分钟

概述

不直接跟目标进行交互,跟代理进行交互。

代理:提供了修改底层实现的方式(比如:属性的修改和赋值)

这就要求,必须把底层实现写成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重写底层实现; 我们不能重写目标对象的底层实现,但是我们能重写代理的底层实现;为什么这样设计呢?如果让我们重写目标对象的底层实现,容易把对象搞得乱七八糟,所以,在外面套一个代理,只操作代理。