proxy 可拦截属性读写以限制动态操作:set 拦截禁止未声明属性,defineproperty 拦截防止修改不可配置属性,deleteproperty 和 has 拦截控制删除与 in 行为,ownkeys 拦截适配 for...in,get 拦截需谨慎处理原型访问。

可以通过 Proxy 拦截对象的属性读写操作,从而限制动态属性的添加、删除或访问。核心在于利用 set、defineProperty、deleteProperty 等 trap 方法进行拦截和校验。
禁止新增未声明的属性
在 set 拦截中检查目标对象是否已存在该属性,若不存在则拒绝赋值(返回 false 或抛出错误)。
- 使用
Reflect.has(target, prop)判断属性是否已在原始对象上定义 - 对 Symbol 属性也需一并检查,避免绕过字符串键限制
- 若允许部分动态属性(如白名单),可提前配置
allowedKeys = new Set(['id', 'name'])
冻结已有属性的可配置性
配合 Object.freeze() 或手动设置 configurable: false,防止后续通过 defineProperty 修改属性特性。
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
-
Proxy本身不改变属性描述符,需在代理前或definePropertytrap 中主动控制 - 在
defineProperty拦截里拒绝configurable: true的尝试,或仅允许特定属性重定义 - 注意:
Object.defineProperty对不可配置属性的修改(如 writable 变更)会直接报错,无需额外拦截
拦截 delete 和 in 操作
阻止删除关键属性,并控制 in 运算符的行为,使隐藏属性对外不可见。
- 在
deleteProperty中返回false表示删除失败(严格模式下会抛错) - 用
hastrap 自定义prop in obj的结果,例如隐藏内部字段 - 若需支持
for...in过滤,还需拦截ownKeys并返回精简的键数组
兼容原型与继承行为
确保限制逻辑不影响原型链查找,同时避免意外暴露原型上的属性。
-
gettrap 中慎用Reflect.get(target, prop, receiver),否则可能触发原型上同名 getter - 若要完全隔离原型访问,可在
get中显式限定只查自身属性:Object.prototype.hasOwnProperty.call(target, prop) - 设置
isExtensible: false后,Proxy会自动拒绝新增属性,但需配合preventExtensionstrap 显式控制










