用代理模式开一家婚姻介绍所吧

这样看来,开婚介所确实是个发家致富的好路子。既然暴富的机会就在眼前,那么事不宜迟,我们接下来就一起用 JavaScript 来实现一个小型婚介所。

前置知识: ES6中的Proxy

在 ES6 中,提供了专门以代理角色出现的代理器 —— Proxy。它的基本用法如下:

  1. const proxy = new Proxy(obj, handler)

第一个参数是我们的目标对象,也就是上文中的“未知妹子”。handler 也是一个对象,用来定义代理的行为,相当于上文中的“婚介所”。当我们通过 proxy 去访问目标对象的时候,handler会对我们的行为作一层拦截,我们的每次访问都需要经过 handler 这个第三方。

“婚介所”的实现

未知妹子的个人信息,刚问了下我们已经注册了 VIP 的同事哥,大致如下:

  1. // 未知妹子
  2. const girl = {
  3. // 姓名
  4. name: '小美',
  5. // 自我介绍
  6. aboutMe: '...'(大家自行脑补吧)
  7. // 年龄
  8. age: 24,
  9. // 职业
  10. career: 'teacher',
  11. // 假头像
  12. fakeAvatar: 'xxxx'(新垣结衣的图片地址)
  13. // 真实头像
  14. avatar: 'xxxx'(自己的照片地址),
  15. // 手机号
  16. phone: 123456,
  17. }

婚介所收到了小美的信息,开始营业。大家想,这个姓名、自我介绍、假头像,这些信息大差不差,曝光一下没问题。但是人家妹子的年龄、职业、真实头像、手机号码,是不是属于非常私密的信息了?要想 get 这些信息,平台要考验一下你的诚意了 —— 首先,你是不是已经通过了实名审核?如果通过实名审核,那么你可以查看一些相对私密的信息(年龄、职业)。然后,你是不是 VIP ?只有 VIP 可以查看真实照片和联系方式。满足了这两个判定条件,你才可以顺利访问到别人的全部私人信息,不然,就劝退你提醒你去完成认证和VIP购买再来。

  1. // 普通私密信息
  2. const baseInfo = ['age', 'career']
  3. // 最私密信息
  4. const privateInfo = ['avatar', 'phone']
  5. // 用户(同事A)对象实例
  6. const user = {
  7. ...(一些必要的个人信息)
  8. isValidated: true,
  9. isVIP: false,
  10. }
  11. // 掘金婚介所登场了
  12. const JuejinLovers = new Proxy(girl, {
  13. get: function(girl, key) {
  14. if(baseInfo.indexOf(key)!==-1 && !user.isValidated) {
  15. alert('您还没有完成验证哦')
  16. return
  17. }
  18. //...(此处省略其它有的没的各种校验逻辑)
  19. // 此处我们认为只有验证过的用户才可以购买VIP
  20. if(user.isValidated && privateInfo.indexOf(key) && !user.isVIP) {
  21. alert('只有VIP才可以查看该信息哦')
  22. return
  23. }
  24. }
  25. })

以上主要是 getter 层面的拦截。假设我们还允许会员间互送礼物,每个会员可以告知婚介所自己愿意接受的礼物的价格下限,我们还可以作 setter 层面的拦截。:

  1. // 规定礼物的数据结构由type和value组成
  2. const present = {
  3. type: '巧克力',
  4. value: 60,
  5. }
  6. // 为用户增开presents字段存储礼物
  7. const girl = {
  8. // 姓名
  9. name: '小美',
  10. // 自我介绍
  11. aboutMe: '...'(大家自行脑补吧)
  12. // 年龄
  13. age: 24,
  14. // 职业
  15. career: 'teacher',
  16. // 假头像
  17. fakeAvatar: 'xxxx'(新垣结衣的图片地址)
  18. // 真实头像
  19. avatar: 'xxxx'(自己的照片地址),
  20. // 手机号
  21. phone: 123456,
  22. // 礼物数组
  23. presents: [],
  24. // 拒收50块以下的礼物
  25. bottomValue: 50,
  26. // 记录最近一次收到的礼物
  27. lastPresent: present,
  28. }
  29. // 掘金婚介所推出了小礼物功能
  30. const JuejinLovers = new Proxy(girl, {
  31. get: function(girl, key) {
  32. if(baseInfo.indexOf(key)!==-1 && !user.isValidated) {
  33. alert('您还没有完成验证哦')
  34. return
  35. }
  36. //...(此处省略其它有的没的各种校验逻辑)
  37. // 此处我们认为只有验证过的用户才可以购买VIP
  38. if(user.isValidated && privateInfo.indexOf(key)!==-1 && !user.isVIP) {
  39. alert('只有VIP才可以查看该信息哦')
  40. return
  41. }
  42. }
  43. set: function(girl, key, val) {
  44. // 最近一次送来的礼物会尝试赋值给lastPresent字段
  45. if(key === 'lastPresent') {
  46. if(val.value < girl.bottomValue) {
  47. alert('sorry,您的礼物被拒收了')
  48. return
  49. }
  50. // 如果没有拒收,则赋值成功,同时并入presents数组
  51. girl.lastPresent = val
  52. girl.presents = [...girl.presents, val]
  53. }
  54. }
  55. })