Skip to content
兰亭古墨 edited this page Jun 23, 2021 · 1 revision
const target = {
  name: 'hefeng6500'
};
const handler = {
  get(target, property, receiver) {
    return Reflect.get(target, property); // or return target[property];
  },
  set(target, property, value, receiver) {
    if (target[property] !== value) {
      Reflect.set(target, property, value); // or target[property] = value
    }
  }
}
const proxy = new Proxy(target, handler)
console.log(proxy);
console.log(proxy.name);

proxy.name = "yanglong"
console.log(proxy.name);

// 访问和设置代理对象不会影响原始对象
console.log(target);

1、getter 函数用于拦截对 proxy 实例的访问,它接受target(目标对象), property(属性), receiver(最初被调用的对象,通常是 proxy)。如下形式的访问都可以被拦截到:

  • 访问属性: proxy[foo]proxy.bar
  • 访问原型链上的属性: Object.create(proxy)[foo]
  • Reflect.get()

2、setter 函数用于在设置 proxy 实例属性时进行拦截,它接受target(目标对象), property(属性), value(新值), receiver(最初被调用的对象,通常是 proxy)。如下形式的proxy值设置都可以被拦截到:

  • 指定属性值:proxy[foo] = barproxy.foo = bar
  • 指定继承者的属性值:Object.create(proxy)[foo] = bar
  • Reflect.set()
Clone this wiki locally