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

  1. let obj = {}
  2. /*
  3. 在这里写你的代码。
  4. */
  5. obj.a = 1
  6. obj.a // => obj.a 值是 100

是不是感觉很诡异。可以用 Object.defineProperty 或 Proxy 来实现。

  1. // Object.defineProperty
  2. Object.defineProperty(obj, 'a', {
  3. get() {return 100}
  4. })
  5. // Proxy
  6. const handler = {
  7. get(obj, prop) {return prop === 'a' ? 100 : undefined}
  8. }
  9. obj = new Proxy({}, handler)

代理模式介绍

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

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

  1. const user = {
  2. name: 'joel',
  3. tel: '138...'
  4. }
  5. const handler = {
  6. get(obj, prop) {
  7. if(prop === 'tel') {
  8. return isAdmin ? obj.tel : '无访问权限'
  9. }
  10. return obj[prop]
  11. }
  12. }
  13. const outerUser = new Proxy(user, handler)

代理模式的使用场景:

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

参考文档