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

这篇具有很好参考价值的文章主要介绍了JavaScript代理模式:如何实现对象的动态代理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

JavaScript代理模式

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

代理模式的定义

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

代理模式的实现

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

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

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的访问,并输出了相应的日志信息。

代理模式的应用

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

缓存代理

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

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

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函数的调用,并实现了缓存代理的功能。

权限控制代理

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

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

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对象来实现代理模式。文章来源地址https://www.toymoban.com/news/detail-513897.html

到了这里,关于JavaScript代理模式:如何实现对象的动态代理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java的动态代理如何实现

    jdkproxy动态代理必须基于接口(interface)实现 接口 UserInterface.java 原始实现类: UseServiceImpl.java 代理类 : UserProxyFactoryBJdk.java 执行结果: before the name of 123is Austin after Cglib实现动态代理与JdkProxy不同, 是通过构建继承类实现 原始类 UseServiceImpl.java 代理类 : UserProxyFactoryByCglib.ja

    2024年02月09日
    浏览(30)
  • java基础之Java的动态代理如何实现

    目录 Java实现动态代理的两种方式 两种动态代理的区别 JDK 的动态代理是基于接口的代理。 CGLIB 是基于继承的代理。 总结 补充 静态代理和动态代理的区别 动态代理的用途 Spring AOP的实现方式 JDK 动态代理代码示例 Cglib动态代理代码示例 JDK动态代理 :Java.lang.reflect 包中的Pr

    2024年02月03日
    浏览(27)
  • JavaScript 设计模式之代理模式

    其实这种模式在现在很多地方也都有使用到,如 Vue3 中的数据相应原理就是使用的 es6 中的 Proxy 代理及 Reflect 反射的方式来处理数据响应式 我们日常在使用数据请求时,也会用到一些代理的方式,比如在请求不同的域名,端口等会出现跨域的情况,这时就需要用到代理去获

    2024年02月19日
    浏览(36)
  • 设计模式之代理模式(静态代理&动态代理)

    目录 1、什么是代理模式 2、代理模式的结构 3、代理模式的实现 3.1 静态代理和动态代理概念 3.2 静态代理 3.3 动态搭理 3.3.1 代码实现 3.3.2 Proxy类讲解 4、动态代理VS静态代理 5、代理模式优缺点 由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象

    2024年02月03日
    浏览(24)
  • JavaScript设计模式(四)——策略模式、代理模式、观察者模式

    个人简介 👀 个人主页: 前端杂货铺 🙋‍♂️ 学习方向: 主攻前端方向,正逐渐往全干发展 📃 个人状态: 研发工程师,现效力于中国工业软件事业 🚀 人生格言: 积跬步至千里,积小流成江海 🥇 推荐学习:🍍前端面试宝典 🍉Vue2 🍋Vue3 🍓Vue2/3项目实战 🥝Node.js🍒

    2024年02月09日
    浏览(32)
  • 设计模式8:代理模式-动态代理

    上一篇:设计模式8:代理模式-静态代理 “动态”的含义是 代码生成代理类,一个代理类可以代理多个接口 。 动态区别于 死板 ,静态代理中一个代理类只能代理一个接口,其他不同的接口,就需要再手写不同的代理类,这就很 死板 。 动态代理类似于在安卓里面,我们常

    2024年02月09日
    浏览(22)
  • javascript设计模式-三种代理

    将抽象与实现隔离开来,以便二者独立变化。常用于事件驱动的程序设计。有些地方它和适配器与门面很类似。下面是最简单的桥接模式,但适配器是一种包装器。门面一般是同一个类中方法的抽象和组合,而桥接通常是收集几个类的。 这种方式也要注意使用场合,如果一个

    2024年01月20日
    浏览(31)
  • 代理模式--静态代理和动态代理

    定义:代理模式就是代替对象具备真实对象的功能,并代替真实对象完成相应的操作并且在不改变真实对象源代码的情况下扩展其功能,在某些情况下,⼀个对象不适合或者不能直接引⽤另⼀个对象,⽽代理对象可以在客户端和⽬标对象之间起到中介的作⽤ 使用代理模式可以

    2024年02月15日
    浏览(32)
  • 代理模式——对象的间接访问

    由于某些原因,客户端不想或不能直接访问某个对象,此时可以通过一个被称为“代理”的第三者来实现间接访问,该方案对应的设计模式被称为代理模式。 代理模式是一种应用很广泛的结构型设计模式,而且变化很多。在代理模式中引入了一个新的代理对象,代理对象可以

    2024年02月14日
    浏览(67)
  • 温故知新之:代理模式,静态代理和动态代理(JDK动态代理)

    代理模式可以在不修改被代理对象的基础上,通过扩展代理类,进行一些功能的附加与增强。 静态代理 是一种代理模式的实现方式,它在编译期间就已经确定了代理对象,需要为每一个被代理对象创建一个代理类。静态代理的实现比较简单,但是每个被代理对象都需要创建

    2024年02月11日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包