JavaScript ES6代理商的实际用例,快速教你用好ES6代理商

作者 : 开心源码 本文共3854个字,预计阅读时间需要10分钟 发布时间: 2022-05-13 共198人阅读

元编程是一种强大的技术,使你能够编写可以创立其余程序的程序。ES6借助代理商和许多相似功能,使在JavaScript中利用元编程变得更加容易。ES6 Proxy(代理商) 有助于重新定义对象的基本操作,从而为各种可能性打开了大门。

本指南可以帮助您了解为什么ES6代理商如此之好,尤其是对于元编程而言:

  • 什么是ES6代理商

  • 如何以及何时实施代理商

  • 如何使用ES6代理商执行访问控制,数据绑定和缓存

  • ES6代理商不是性能密集型任务的理想选择

先决条件和结果

本教程主要针对有JavaScript经验的开发人员,至少要熟习ES6代理商的概念。假如你已经对代理商作为一种设计模式有了牢固的了解,那么这些知识应该可以转化为现实。

阅读本指南后,你应该能够:

  • 理解什么是ES6代理商,如何实现以及何时使用它

  • 使用ES6代理商进行访问控制,缓存和数据绑定

ES6代理商剖析:目标(Target),解决程序(handler)和圈套(trap)

从根本上来说,代理商是指某件事或者某人成为其余事物的替代品,所以不论是什么东西,都要经过替代品才能达到真正的交易。ES6代理商的工作原理也是如此。

为了有效地实现和使用ES6代理商,你必需理解三个关键术语:

  1. Target——代理商人所替代的真正的交易,目标是站在代理商背后的东西。这可以是任何对象。

  2. Handler——一个包含所有代理商的圈套逻辑的对象。

  3. Trap——与操作系统中的圈套相似,此上下文中的圈套是以某种方式提供对对象的访问的方法(可了解为阻拦行为)。

综上所述,下面是最简单的实现,假如使用ES6代理商,对象中不存在给定的属性,则可以返回不同的内容。

 const target = {  someProp: 1 } ​ const handler = {  get: function(target, key) {  return key in target ?   target[key] :   'Doesn't exist!';  } } ​ const proxy = new Proxy(target, handler); console.log(proxy.someProp) // 1 console.log(proxy.someOtherProp) // Doesn't exist!

ES6代理商是一项强大的功能,可促进JavaScript中对象的虚拟化。

数据绑定:同步多个对象

因为数据绑定的复杂性,它通常很难实现。ES6代理商实现双向数据绑定的应用可以在JavaScript的MVC库中看到,在这些库中,当DOM发生变化时,对象会被修改。

简而言之,数据绑定是一种将多个数据源绑定在一起以使其同步的技术。

假设存在一个名为 username 的 “。

 <input type="text" id="username" />

假设你要使此输入的值与对象的属性保持同步。

const inputState = {  id: 'username',  value: '' }

当输入的值发生变化时,通过监听输入的变化事件,而后升级 inputState 的值,修改 inputState 是相当容易的。然而,反过来,在 inputState 被修改时升级输入,则相当困难。

ES6代理商可以在这种情况下提供帮助。

 const input = document.querySelector('#username') const handler = {  set: function(target, key, value) {  if (target.id && key === 'username') {  target[key] = value;  document.querySelector(`#${target.id}`)  .value = value;  return true  }  return false  } } ​ const proxy = new Proxy(inputState, handler) proxy.value = 'John Doe' console.log(proxy.value, input.value)  // 双方都将印有“ John Doe”

这样,当 inputState 更改时,input 将反映已进行的更改。结合侦听 change 事件,这将生成 inputinputState 的简单双向数据绑定。

尽管这是一个有效的用例,但通常不建议这样做。以后再说。

缓存:提高代码性能

缓存是一个古老的概念,它允许非常复杂和大型的应用程序保持相对的性能。缓存是存储某些数据的过程,以便在请求时可以更快地提供数据。缓存并不永久地存储任何数据。缓存失效是保证缓存新鲜的过程。这是开发人员共同的苦恼。正如Phil Karlton所说:”计算机科学中只有两件难事:缓存无效和给事物命名。”

ES6代理商使缓存更加容易。例如,假如你要检查对象中能否存在某些东西,它将首先检查缓存并返回数据,或者者假如不存在则进行其余操作以获取该数据。

假设你需要进行很多API调用才能获取特定信息并对其进行解决。

 const getScoreboad = (player) => {  fetch('some-api-url')  .then((scoreboard) => {  // 用记分牌做点什么  }) }

这就意味着,每当需要一个球员的记分牌时,就必需进行一次新的调用。相反,你可以在第一次请求时缓存记分牌,随后的请求可以从缓存中获取。

const cache = {   'John': ['55', '99'] } const handler = {   get: function(target, player) {  if(target[player] {  return target[player]  } else {  fetch('some-api-url')  .then(scoreboard => {  target[player] = scoreboard  return scoreboard  })  }  } } const proxy = new Proxy(cache, handler) // 访问缓存并使用记分牌做少量事情

这样,仅当缓存中不包含玩家的记分牌时,才会进行API调用。

访问控制:控制进出对象的内容

最简单的用例是访问控制,ES6代理商的大部分内容都属于访问控制。

让我们探究使用E6代理商的访问控制的少量实际应用。

1. 验证

ES6代理商最直观的用例之一是验证对象内部的内容,以确保对象中的数据尽可能精确。例如,假如你想强制执行产品形容的最大字符数,可以这样做。

const productDescs = {} const handler = {  set: function(target, key, value) {  if(value.length > 150) {  value = value.substring(0, 150)  }  target[key] = value  } } const proxy = new Proxy(productDescs, handler)

现在,即便你增加的形容超过150个字符,也会被删减并增加。

2. 提供对象的只读视图

有时候你可能要确保不以任何方式修改对象,并且只能将其用于读取目的。 JavaScript提供了 Object.freeze() 来执行此操作,但是使用代理商时,该行为更可自己设置。

 const importantData = {  name: 'John Doe',  age: 42 } ​ const handler = {  set: 'Read-Only',  defineProperty: 'Read-Only',  deleteProperty: 'Read-Only',  preventExtensions: 'Read-Only',  setPrototypeOf: 'Read-Only' } ​ const proxy = new Proxy(importantData, handler)

现在,当你尝试以任何方式更改对象时,你只会收到一个字符串,表示只读。否则,你可能会引发错误以指示该对象是只读的。

3. 私有属性

JavaScript本身并没有私有属性,除了闭包。当 Symbol 数据类型被引入时,它被用来模仿私有属性。但随着Object.getOwnPropertySymbols 方法的引入,它被抛弃了。ES6代理商并不是一个完美的处理方案,但在紧要关头它们可以完成任务。

一种常见的商定是通过在名称前加上下划线来标识私有属性,这个商定允许你使用ES6代理商。

 const object = {  _privateProp: 42 } ​ const handler = {  has: function(target, key) {  return !(key.startsWith('_') && key in target)  },  get: function(target, key, receiver) {  return key in receiver ? target[key] : undefined  } } ​ const proxy = new Proxy(object, handler) proxy._privateProp // undefined

增加 ownKeysdeleteProperty 会让这个实现更接近于真正的私有属性。而后,你依然可以在开发者控制台中查看代理商对象。假如你的用例与上面的实现一致,它依然适用。

为何以及何时使用代理商

ES6代理商并不是性能密集型任务的理想选择。这就是为什么进行必要的测试是至关重要的。代理商可以在任何预期对象的地方使用,代理商只要几行代码就能提供复杂的功能,这使它成为元编程的理想功能。

代理商通常与另一个称为Reflect的元编程功能一起使用。

总结

对了,小编为大家准备了一套2020最新的web前台资料,需要点击下方链接获取方式

学习前台,你掌握这些。二线也能轻松拿8K以上

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » JavaScript ES6代理商的实际用例,快速教你用好ES6代理商

发表回复