Proxy 代理
Proxy 是代理的构造函数,通过新建对象的形式,对新建的对象的操作进行自定义处理
语法:
new Promise( target , handler )
target 是拦截操作的目标对象,
handler 是用来自定义代理对象的各种可代理操作.具体使用可参考下面这个例子:
var target = new Proxy(target, { "get": function (oTarget, sKey) { return oTarget[sKey] || oTarget.getItem(sKey) || undefined; }, "set": function (oTarget, sKey, vValue) { if (sKey in oTarget) { return false; } return oTarget.setItem(sKey, vValue); }, "deleteProperty": function (oTarget, sKey) { if (sKey in oTarget) { return false; } return oTarget.removeItem(sKey); }, "enumerate": function (oTarget, sKey) { return oTarget.keys(); }, "ownKeys": function (oTarget, sKey) { return oTarget.keys(); }, "has": function (oTarget, sKey) { return sKey in oTarget || oTarget.hasItem(sKey); }, "defineProperty": function (oTarget, sKey, oDesc) { if (oDesc && "value" in oDesc) { oTarget.setItem(sKey, oDesc.value); } return oTarget; }, "getOwnPropertyDescriptor": function (oTarget, sKey) { var vValue = oTarget.getItem(sKey); return vValue ? { "value": vValue, "writable": true, "enumerable": true, "configurable": false } : undefined; }, });
通过新建对象形式返回对象的handler不能撤销,特意提供了一个API来提供可撤销代理的函数
Proxy.revocable( target , handler )
需要注意一点:
返回的对象跟 new Promise() 不同, 返回对象的格式为 {"proxy": proxy, "revoke": revoke},proxy为代理对象,revoke为取消代理的方法
调用revoke后,代理会被撤销,这时候访问 proxy 会报错,原因之后再详细描述
var revocable = Proxy.revocable({}, { get(target, name) { return "[[" + name + "]]"; } }); var proxy = revocable.proxy; proxy.foo; // "[[foo]]" revocable.revoke(); // 执行撤销方法 proxy.foo; // TypeError proxy.foo = 1 // 同样 TypeError delete proxy.foo; // 还是 TypeError typeof proxy // "object",因为 typeof 不属于可代理操作