码迷,mamicode.com
首页 > 其他好文 > 详细

Proxy 代理

时间:2018-01-15 12:32:05      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:error   enum   cab   fun   function   tar   evo   blog   gpo   

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 代理

标签:error   enum   cab   fun   function   tar   evo   blog   gpo   

原文地址:https://www.cnblogs.com/xiaxiaodong/p/8287429.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!