创建空代理
-
最简单代理是空代理,既处了作为一个抽象的目标对象,什么也不做。默认情况下,在代理对象上执行的所有操作都会无障碍地传播到目标对象。因此,在任何可以使用目标对象的地方,都可以通过同样的方式来使用与之关联的代理对象。
-
代理是使用 Proxy 构造函数创建的。这个构造函数接受两个参数: 目标对象和处理程序对象缺少其中一个参数都会抛出TypeError。要创建空代理,可以传一个简单的对象字面量作为处理程序对象,从而让所有操作畅通无阻地抵达目标对象。
-
如下面的代码所示,在代理对象上执行的任何操作实际上都会应用到目标对象。唯一可感知的不同就是代码中操作的都是代理对象。
const target = { id: "target", }; const handle = {}; // 创建代理对象 const proxy = new Proxy(target, handle); // id属性会访问同一个值 console.log(target.id); // target console.log(proxy.id); // target // 给目标属性赋值会反应在两个对象上,因为两个对象访问的是同一个值 target.id = "foo"; console.log(target.id); // foo console.log(proxy.id); //foo // 给代理属性赋值会反应在两个对象上,因为这个赋值会转移到目标对象 proxy.id = "bar"; console.log(proxy.id); //bar console.log(target.id); // bar // hasOwnProperty()方法用在两个地方 (注意hasOwnProperty是用来检测属性是否为对象的[自有属性]) // 都会应用到目标对象上 console.log(target.hasOwnProperty("id")); // true console.log(proxy.hasOwnProperty("id")); // true // proxy.prototype是undefined // 因此不能使用instanceof操作符 console.log(target instanceof Proxy); //TypeError: Function has non-object prototype 'undefined' in instanceof check console.log(proxy instanceof Proxy); //TypeError: Function has non-object prototype 'undefined' in instanceof check // 可以用严格相等区分目标和代理 console.log(target === proxy);