如何实现,获取对象的属性值不等于设置的属性值。补全下面的代码:
let obj = {}
/*
在这里写你的代码。
*/
obj.a = 1
obj.a // => obj.a 值是 100
是不是感觉很诡异。可以用 Object.defineProperty 或 Proxy 来实现。
// 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)
代理模式的使用场景:
- 权限的控制。如防火墙,白名单。
- 缓存。在某些条件下,对属性或计算结果做缓存。