JavaScript代理模式:如何实现对象的动态代理

news/2024/7/6 6:32:37 标签: javascript, 代理模式, 开发语言

JavaScript代理模式

在JavaScript中,代理模式是一种常见的设计模式,它允许我们在不改变对象本身的情况下,通过代理对象来控制对象的访问。代理模式可以用于实现缓存、权限控制、远程调用等功能。

代理模式的定义

代理模式是指在访问对象时引入一定程度的间接性,因为这种间接性可以附加多种用途,所以代理模式是一种非常常用的设计模式。

代理模式的实现

在JavaScript中,我们可以使用Proxy对象来实现代理模式。Proxy对象是ES6中新增的一个对象,它可以用来代理另一个对象,拦截并改变该对象的默认行为。

下面是一个简单的例子,我们通过代理对象来控制对原始对象的访问:

javascript">let target = {
  name: 'Tom',
  age: 18
};

let proxy = new Proxy(target, {
  get(target, key) {
    console.log(`get ${key}`);
    return target[key];
  },
  set(target, key, value) {
    console.log(`set ${key}=${value}`);
    target[key] = value;
  }
});

proxy.name; // 输出:get name
proxy.age = 20; // 输出:set age=20

在上面的例子中,我们创建了一个原始对象target,然后通过Proxy对象创建了一个代理对象proxy。代理对象proxy拦截了对原始对象target的访问,并输出了相应的日志信息。

代理模式的应用

代理模式在实际开发中有很多应用场景,下面介绍其中的两个:

缓存代理

缓存代理是指在访问某个对象时,如果该对象已经被访问过,那么直接返回缓存中的数据,否则执行原始的访问操作,并将结果缓存起来。

下面是一个简单的例子,我们通过代理对象来实现缓存代理:

javascript">function createProxy(fn) {
  let cache = new Map();
  return new Proxy(fn, {
    apply(target, thisArg, args) {
      let key = args.join(',');
      if (cache.has(key)) {
        console.log(`get result from cache: ${cache.get(key)}`);
        return cache.get(key);
      } else {
        let result = target.apply(thisArg, args);
        cache.set(key, result);
        console.log(`set result to cache: ${result}`);
        return result;
      }
    }
  });
}

function add(a, b) {
  return a + b;
}

let proxy = createProxy(add);

proxy(1, 2); // 输出:set result to cache: 3
proxy(1, 2); // 输出:get result from cache: 3

在上面的例子中,我们通过createProxy函数创建了一个代理对象proxy,该代理对象拦截了对add函数的调用,并实现了缓存代理的功能。

权限控制代理

权限控制代理是指在访问某个对象时,如果当前用户没有权限访问该对象,那么直接返回错误信息,否则执行原始的访问操作。

下面是一个简单的例子,我们通过代理对象来实现权限控制代理:

javascript">let target = {
  name: 'Tom',
  age: 18
};

let proxy = new Proxy(target, {
  get(target, key) {
    if (key === 'age') {
      console.log(`access denied: ${key}`);
      return undefined;
    } else {
      console.log(`get ${key}`);
      return target[key];
    }
  }
});

proxy.name; // 输出:get name
proxy.age; // 输出:access denied: age

在上面的例子中,我们创建了一个原始对象target,然后通过Proxy对象创建了一个代理对象proxy。代理对象proxy拦截了对原始对象target的访问,并实现了权限控制的功能。

总结

代理模式是一种非常常用的设计模式,它可以用于实现缓存、权限控制、远程调用等功能。在JavaScript中,我们可以使用Proxy对象来实现代理模式


http://www.niftyadmin.cn/n/475559.html

相关文章

【微服务架构设计和实现】4.9 微服务测试和部署最佳实践

往期回顾: 第一章:【云原生概念和技术】 第二章:【容器化应用程序设计和开发】 第三章:【基于容器的部署、管理和扩展】 第四章:【4.1 微服务架构概述和设计原则】 第四章:【4.2 服务边界的定义和划分…

升级HarmonyOS 3,通话一步切换更便捷

小伙伴们,今天和大家来聊聊HarmonyOS 3音频播控中心有哪些真香体验。不少朋友可能会脱口而出:一键切换音频App,一键实现音频跨设备流转,还有音频共享。这一次,音频播控中心又带来了新技能——一键切换通话音频。 相信大…

高速电路设计系列分享-熟悉JESD204B(中)

目录 概要 整体架构流程 技术名词解释 技术细节 1.数据链路层 小结 概要 提示:这里可以添加技术概要 随着高速ADC跨入GSPS范围,与FPGA(定制ASIC)进行数据传输的首选接口协JESD204B。为了捕捉频率范围更高的RF频谱,需要宽带RFADC。在其推动下…

[230611] 阅读TPO56 23|21:00-21:30|7:10

目录 03 Urban Heat Islands [4]否定事实信息题 [8]事实信息题 [9]句子插入题 03 Urban Heat Islands [4]否定事实信息题 没有仔细理解题目‼️ 题目问的是有利于热岛效应的是...? vegetation and soil typical of rural areas vegetation属于rural areas的,不…

服务器如何配置支持history模式

88. 服务器如何配置支持history模式 服务器配置支持 history 模式是在使用前端路由时的常见需求,它使得在使用 history API 进行页面导航时,服务器能正确地返回对应的页面内容而不是默认的 404 页面。本文将介绍如何配置服务器以支持 history 模式&…

C语言中的库是什么?如何调用系统提供的库函数?

所谓库,就是一些已经写好了的代码集合,它们提供了一些现成的函数,供我们在编程时使用。这样,我们就不用每次都从头写起了,只需要调用它们就好啦!就像是我们在做菜时,不用从头制作酱料&#xff0…

基于Python+OpenCV的视频字符化(深度学习+机器视觉)含全部工程源码

目录 前言总体设计系统整体结构图系统流程图 运行环境Python 环境OpenCV环境 模块实现1. 视频读取及处理2. 色素块识别与替换3. 视频合成4. 操作系统上的实现 系统测试工程源代码下载其它资料下载 前言 本项目利用 OpenCV 提供的轻量、高效的 C类和 Python 接口,实…

右键文件夹添加指定打开的程序(如:IDEA、PyCharm等)

一.打开注册表 使用winR打开运行界面(默认为左下角)输入regedit 二.进入指定目录 1.找不到可直接复制路径: 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\shell 2.在当前路径shell下右键->新建->项->命名IDEA (名字任意即可),修改默认…