zoukankan      html  css  js  c++  java
  • 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 不属于可代理操作
  • 相关阅读:
    JAVA复习笔记之GC部分
    elasticsearch学习笔记--原理介绍
    JavaScript--Array数组jion方法使用
    MyBatis探究-----缓存机制详解
    C#---- Winform控件PictureBox详解
    Mybatis探究-----一对一、一对多关联查询
    C#-----CancellationTokenSource取消线程
    MyBatis探究-----接口类映射XML文件中符号$和#的区别
    C#-----定时器的几种实现
    eclipse如何在不联网的情况下引入dtd约束文件
  • 原文地址:https://www.cnblogs.com/xiaxiaodong/p/8287429.html
Copyright © 2011-2022 走看看