计算属性名本身不直接参与元编程,但能与 Proxy + Reflect 配合实现运行时动态契约控制,即根据属性名规则(如“_”私有、“$”只读、“valid_”校验)在 get/set 陷阱中动态启用访问限制、类型校验或权限拦截,并通过 Reflect 执行默认行为,兼顾语义一致性与契约约束。

计算属性名本身不直接参与元编程,但它能与 Proxy + Reflect 配合,实现运行时动态契约控制——即根据属性名规则自动施加访问限制、类型校验或权限拦截。
计算属性名作为契约触发条件
在 Proxy 的 get/set 陷阱中,可通过属性名(propertyKey)动态判断是否启用某类契约逻辑。比如以 “_”开头的属性视为私有,以 “$”开头的视为只读,以 “valid_”开头的需校验后才允许赋值。
- 利用 propertyKey 做字符串匹配或正则判断,决定是否放行、抛错或转换值
- 避免硬编码每个属性名,把规则写在 handler 里,实现“一次定义、处处生效”
- 例如:
if (prop.startsWith('valid_age')) { /* 校验是否为正整数 */ }
Proxy 拦截 + Reflect 执行默认行为
Proxy 负责“决策”,Reflect 负责“执行”。在拦截逻辑中调用 Reflect 方法,既保留原始语义,又可插入契约检查。
-
get(target, prop)中先检查prop是否在白名单/符合命名规范,再调用Reflect.get(target, prop) -
set(target, prop, value)中对特定命名模式的属性做类型/范围校验,通过后才调用Reflect.set(target, prop, value) - 这样既不破坏对象原有行为,又能统一施加契约约束
结合响应式系统实现契约联动
当契约依赖外部状态(如用户角色、环境配置)时,可将这些状态纳入响应式依赖,使契约行为随状态变化自动更新。
- 在 Vue 中,把校验规则函数定义为 computed,返回一个动态 handler 对象
- handler 内部引用 userInfo.role 或 appMode 等响应式数据,Proxy 实例随之重建或重绑定
- 例如:开发模式下允许写入
_debug属性,生产环境则拦截并警告
实战:带命名契约的配置对象
下面是一个可直接运行的示例,实现基于属性名前缀的三类契约:
-
readonly_*:禁止修改 -
required_*:赋值必须非空且为字符串 -
log_*:每次读写都打印日志


















