proxy 的 deleteproperty 拦截器用于监听 delete 和 reflect.deleteproperty 调用,接收 target 和 property 参数,须返回布尔值以表示删除意图是否被允许,需手动执行删除操作,适用于日志、权限控制等场景。

JavaScript 中 Proxy 通过 handler.deleteProperty 拦截器监听对象属性的删除操作,它会在 delete obj.prop 或 Reflect.deleteProperty() 被调用时触发。
deleteProperty 拦截器的基本用法
该方法接收两个参数:目标对象(target)和要删除的属性名(property),必须返回布尔值。返回 true 表示删除成功,false 表示失败(严格模式下会抛出 TypeError)。
- 它不会自动执行删除,需手动调用
delete target[property]或Reflect.deleteProperty(target, property) - 不调用底层删除操作,属性依然存在;返回
true也不代表一定删掉了,逻辑由你控制 - 拦截的是「删除意图」,不是最终结果,适合做日志、权限校验或副作用处理
监听并记录删除行为
可在 deleteProperty 中打印日志、存入数组或触发事件:
Java Linux版下载入口,提供 Oracle JDK 26.0.2 官方 Linux 安装包、Java 环境配置、JDBC 数据库连接和 Java 服务端开发相关信息。
const obj = { name: 'Alice', age: 30 };
const log = [];
const proxy = new Proxy(obj, {
deleteProperty(target, prop) {
console.log(`尝试删除属性: ${prop}`);
log.push(`已删除 ${prop}`);
return delete target[prop]; // 执行真实删除并返回结果
}
});
delete proxy.name; // 输出: 尝试删除属性: name
console.log(obj); // { age: 30 }
console.log(log); // ['已删除 name']
限制删除操作(权限控制)
可阻止特定属性被删除,比如保护内置字段或关键配置:
- 检查
prop是否在黑名单中,是则返回false - 结合上下文判断调用者权限(例如通过闭包传入 token 或 role)
- 注意:返回
false在严格模式下会报错,非严格模式静默失败
const protectedKeys = ['id', 'createdAt'];
const proxy = new Proxy({ id: 1, name: 'test', createdAt: Date.now() }, {
deleteProperty(target, prop) {
if (protectedKeys.includes(prop)) {
console.warn(`禁止删除受保护属性: ${prop}`);
return false; // 阻止删除
}
return delete target[prop];
}
});
delete proxy.id; // warn 输出,实际未删除
console.log(proxy.id); // 1
与 Reflect.deleteProperty 配合使用
推荐用 Reflect.deleteProperty(target, property) 替代 delete target[property],语义更清晰且与 Proxy 规范对齐:
- 它返回布尔值,与
deleteProperty的返回要求一致 - 能正确处理不可配置属性等边界情况
- 避免因属性不存在导致误判(
delete对不存在属性也返回 true)
const proxy = new Proxy({ a: 1 }, {
deleteProperty(target, prop) {
console.log(`准备移除 ${prop}`);
return Reflect.deleteProperty(target, prop);
}
});
不复杂但容易忽略:deleteProperty 不会响应 obj[prop] = undefined 或 obj[prop] = null,这些只是赋值,不是删除。真正监听删除动作,只认 delete 和 Reflect.deleteProperty。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










