计划模式-署理模式

打印 上一主题 下一主题

主题 1053|帖子 1053|积分 3159

简介

在 JavaScript 中,署理模式是一种布局型计划模式,它为其他对象提供一个署理或占位符以控制对这个对象的访问。这种模式是用来创建具有署理功能的对象的,使得客户无需修改代码就能使用署理对象来间接访问某个对象。使用署理模式可以实现多种功能,如安全控制、耽误初始化、网络请求、日记记录等
署理模式的长处



  • 隔离性:通过署理可以隐藏对象的真实复杂性。
  • 开闭原则:可以在不修改原始对象的情况下,通过引入署理对象来扩展功能。
  • 控制访问:可以控制客户对对象的访问。
署理模式的常见类型



  • 虚拟署理:耽误对象的创建直到真正必要时。
  • 保护署理:控制对原始对象的访问,常用于权限控制。
  • 智能引用署理:在对象被访问时执行额外的动作,如引用计数和线程安全检查。
  • 缓存署理:为开销大的运算效果提供临时存储,以便多次请求间共享效果。
  • 远程署理:为一个位于差别地点空间的对象提供一个当地的代表对象。
署理模式实现

在 JavaScript 中,署理模式可以通过简单的对象组合来实现,也可以使用 ES6 提供的 Proxy 类来实现更强大和灵活的署理功能。
1. 使用对象组合实现简单的保护署理
假设我们有一个用户信息对象,我们不渴望直接让外部代码修改用户的年龄。
  1. function Person(name, age) {
  2.     this.name = name;
  3.     this.age = age;
  4. }
  5. const person = new Person("John Doe", 25);
  6. const personProxy = {
  7.     setName(name) {
  8.         console.log('Updating name...');
  9.         person.name = name;
  10.     },
  11.     setAge(age) {
  12.         if (age < 0 || age > 120) {
  13.             console.log("Invalid age");
  14.         } else {
  15.             console.log('Updating age...');
  16.             person.age = age;
  17.         }
  18.     },
  19.     getName() {
  20.         return person.name;
  21.     },
  22.     getAge() {
  23.         return person.age;
  24.     }
  25. };
  26. personProxy.setAge(30); // 正常更新
  27. personProxy.setAge(-1); // 输出 "Invalid age"
  28. console.log(personProxy.getAge()); // 30
复制代码
2.使用 ES6 Proxy 实现更灵活的拦截

ES6 引入的 Proxy 对象允许你创建一个对象的署理,从而提供对根本操纵的自定义举动(属性查找、赋值、枚举、函数调用等)。
  1. let target = {
  2.     name: "John Doe",
  3.     age: 25
  4. };
  5. let handler = {
  6.     get: function (obj, prop) {
  7.         if (prop in obj) {
  8.             console.log(`Getting ${prop}: ${obj[prop]}`);
  9.             return obj[prop];
  10.         } else {
  11.             return "Property does not exist";
  12.         }
  13.     },
  14.     set: function (obj, prop, value) {
  15.         if (prop === 'age' && (value < 0 || value > 120)) {
  16.             console.log("Invalid age");
  17.         } else {
  18.             console.log(`Setting ${prop} to ${value}`);
  19.             obj[prop] = value;
  20.         }
  21.         return true;
  22.     }
  23. };
  24. const proxy = new Proxy(target, handler);
  25. proxy.age = 30;
  26. console.log(proxy.age); // 30
  27. proxy.age = -1; // "Invalid age"
复制代码
在这个例子中,Proxy 对象 proxy 被用来控制对 target 对象的访问。通过 handler 对象定义了对属性的访问和设置的自定义举动。
总结

署理模式在 JavaScript 中是非常有效的,特别是在现代前端框架和 Node.js 中。它提供了一个强大的方式来加强程序的灵活性,加强对对象的访问控制。通过使用 ES6 的 Proxy,开发者可以非常方便地实现复杂的拦截逻辑和举动控制。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

勿忘初心做自己

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表