proxy 的 deleteproperty 拦截器用于捕获属性删除操作,必须返回布尔值,接收目标对象和属性键,需手动调用 reflect.deleteproperty 或 delete 操作,且须尊重不可配置属性的限制。

可以使用 Proxy 的 deleteProperty 拦截器来捕获并控制对象属性的删除操作。
定义 deleteProperty 拦截器
deleteProperty 是一个必须返回布尔值的 trap,用于拦截 delete obj.prop 或 Reflect.deleteProperty() 调用。它接收两个参数:目标对象和待删除的属性键。
- 返回
true表示删除成功(即使属性实际未被删,也对外表现为成功) - 返回
false表示删除失败(严格模式下会抛出TypeError) - 该方法不会自动删除属性,需手动调用
delete target[key]或其他逻辑处理
基础用法示例
下面是一个简单代理,阻止删除以 _ 开头的私有属性:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
const obj = { name: 'Alice', _id: 123, age: 30 };
const proxy = new Proxy(obj, {
deleteProperty(target, key) {
if (key.startsWith('_')) {
console.log(`禁止删除私有属性: ${key}`);
return false; // 阻止删除
}
return delete target[key]; // 允许删除普通属性
}
});
delete proxy.name; // ✅ 成功,返回 true
delete proxy._id; // ❌ 失败,返回 false(严格模式报错)
结合 Reflect.deleteProperty 实现更安全的委托
推荐用 Reflect.deleteProperty(target, key) 替代 delete target[key],因为它更可靠(尤其对访问器属性、不可配置属性等):
- 它会如实反映底层是否可删除,避免手动判断的疏漏
- 与
Object.defineProperty等 API 行为一致,适合构建通用代理 - 若需日志、审计或副作用,可在调用
Reflect.deleteProperty前后添加逻辑
注意不可配置属性的限制
如果目标属性是 configurable: false,即使 deleteProperty 返回 true,实际也无法删除 —— Reflect.deleteProperty 会返回 false,此时代理应尊重底层行为:
const obj = {};
Object.defineProperty(obj, 'locked', { value: 42, configurable: false });
const proxy = new Proxy(obj, {
deleteProperty(target, key) {
const result = Reflect.deleteProperty(target, key);
console.log(`尝试删除 ${key},结果: ${result}`);
return result; // 直接返回底层结果,不强行覆盖
}
});










