第 025 期 一道诡异的题目背后的知识 - 代理模式

111 阅读1分钟

如何实现,获取对象的属性值不等于设置的属性值。补全下面的代码:

let obj = {}

/*
在这里写你的代码。
*/

obj.a = 1 
obj.a // => obj.a 值是 100

是不是感觉很诡异。可以用 js 的 api Object.definePropertyProxy 来实现。

// Object.defineProperty
Object.defineProperty(obj, 'a', {
  get() {return 100}
})

// Proxy
const handler = {
  get(obj, prop) {return prop === 'a' ? 100 : undefined}
}
obj = new Proxy({}, handler)

代理模式介绍

代理模式指:为其它对象提供一个代理对象,并由代理对象控制这个对象的访问。代理模式能起到解藕的作用。解藕对象的核心业务和对象的访问。

代理模式可以控制对对象的访问。我们来看这样的场景,只有超级管理员能获取用户的手机号。用代理模式,实现代码如下:

const user = {
  name: 'joel',
  tel: '138...'
}

const handler = {
  get(obj, prop) {
    if(prop === 'tel') {
      return isAdmin ? obj.tel : '无访问权限'
    }
    return obj[prop]
  }
}

const outerUser = new Proxy(user, handler)

代理模式的使用场景:

  • 权限的控制。如防火墙,白名单。
  • 缓存。在某些条件下,对属性或计算结果做缓存。

参考文档