1. 程式人生 > >Proxy 代理

Proxy 代理

ble 新建 proxy 一個 site urn 目標 pan post

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 )

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 不屬於可代理操作

Proxy 代理