设计思路
- 创建代理对象:使用
Proxy
构造函数创建一个代理,该代理会拦截对目标对象的各种操作。
- 定义权限规则:可以通过一个配置对象来定义不同属性的读写权限。
- 拦截操作并检查权限:在代理的
get
和set
陷阱中,根据权限规则来决定是否允许对属性的读写操作。
关键代码实现
// 目标对象
const target = {
name: 'John',
age: 30
};
// 权限配置
const permissions = {
name: { read: true, write: true },
age: { read: true, write: false }
};
const proxy = new Proxy(target, {
get(target, property) {
if (permissions[property] && permissions[property].read) {
return target[property];
}
throw new Error(`没有读取 ${property} 的权限`);
},
set(target, property, value) {
if (permissions[property] && permissions[property].write) {
target[property] = value;
return true;
}
throw new Error(`没有写入 ${property} 的权限`);
}
});
// 测试读取操作
console.log(proxy.name);
// console.log(proxy.age);
// 测试写入操作
proxy.name = 'Jane';
// proxy.age = 31;