原型链不直接实现权限系统,而是通过基于原型的对象组织方式支撑权限逻辑:将角色、权限、用户建模为继承关系对象,利用属性查找机制快速判定访问能力,并支持动态覆盖与过滤查找,适用于前端轻量兜底和ui体验优化。

原型链本身不直接用于实现权限系统,但它能为权限逻辑提供轻量、可复用的结构支撑。真正起作用的是“基于原型的对象组织方式”——把角色、权限、用户等概念建模为具有继承关系的对象,再结合属性查找机制快速判断访问能力。
用原型链组织权限层级
将不同角色抽象为构造函数或类,让子角色通过 Object.setPrototypeOf() 或 class extends 继承父角色的权限方法,形成自然的权限继承链:
- 定义基础角色如
Role,在其 prototype 上挂载通用权限检查方法(如canRead()、canEdit()) - 创建具体角色如
Editor和Admin,让Admin.prototype指向Editor.prototype,再指向Role.prototype - 实例化用户时,将其
__proto__链接至对应角色的 prototype,访问权限方法时自动沿链查找
运行时权限快速判定
不依赖数据库查询,而是利用原型链的属性查找机制做即时判断:
- 在每个角色 prototype 上定义布尔型权限标识,例如
hasDelete = true、canExport = false - 用户实例调用
user.canExport时,引擎自动从自身→Editor.prototype→Admin.prototype→Role.prototype查找,找到即返回 - 支持动态覆盖:某个
Admin实例可自行设置user.canDelete = false,优先于原型链上的true
配合过滤查找增强灵活性
当需要批量获取某类权限(如“所有可审核的操作”)时,可用原型链遍历 + 属性过滤:
- 写一个工具函数,用
Object.getPrototypeOf()逐层上溯,对每层调用Reflect.ownKeys() - 筛选出以
can或is开头、值为true的自有属性名 - 跳过
constructor、__proto__等非权限字段,避免误判
注意边界与实际落地
原型链适合前端轻量权限兜底或原型阶段验证,但不可替代后端校验:
- 私有字段(
#field)和 Symbol 属性无法被反射获取,权限关键字段建议用字符串键 - 不可枚举属性(
Object.defineProperty中enumerable: false)不会出现在Reflect.ownKeys()结果中,需统一设为enumerable: true - 真实系统仍需服务端 RBAC 校验,原型链仅用于 UI 层快速显隐按钮、禁用操作等体验优化










