proxy 的 get 拦截器需主动判断属性存在性并抛错,应使用 in 或 hasownproperty 而非 target[prop] === undefined;推荐用 hasownproperty 严格检查自有属性,并配合 reflect.get 保证 getter 和 this 正确性。

Proxy 本身不会自动报错,需要在 get 拦截器中主动判断属性是否存在,并手动抛出错误。
使用 in 操作符或 hasOwnProperty 判断属性存在性
在 get 拦截器里,不能只靠 target[prop] 是否为 undefined 来判断属性是否存在——因为属性值本身就可能是 undefined。正确做法是用 prop in target 或 Object.prototype.hasOwnProperty.call(target, prop) 检查。
-
prop in target会查找原型链上的属性,适合宽松检查 -
hasOwnProperty只检查对象自身属性,更严格,推荐用于“仅允许访问自有属性”的场景
在 get 中抛出自定义错误
一旦确认属性不存在,就用 throw new Error(...) 报错。错误信息建议包含属性名和对象标识,便于调试。
const obj = { a: 1 };
const proxy = new Proxy(obj, {
get(target, prop) {
if (!(prop in target)) {
throw new Error(`Property "${prop}" does not exist on object`);
}
return target[prop];
}
});
这样访问 proxy.b 就会立即抛出错误,而不是返回 undefined。
注意 get 拦截器对内部操作的影响
某些内置行为(如 for...in、Object.keys())会触发 ownKeys 和 getOwnPropertyDescriptor,而不是 get。如果想让这些方法也受控,需额外拦截:
-
ownKeys控制哪些键被枚举 -
getOwnPropertyDescriptor控制属性描述符的获取 - 若只拦截
get,Object.keys(proxy)仍可能返回原始对象的所有自有属性
可选:结合 Reflect 提高兼容性
用 Reflect.get(target, prop, receiver) 替代直接访问 target[prop],能正确处理 getter、this 绑定等边界情况:
get(target, prop, receiver) {
if (!target.hasOwnProperty(prop)) {
throw new Error(`No such property: ${String(prop)}`);
}
return Reflect.get(target, prop, receiver);
}
其中 receiver 是代理对象本身,确保 getter 内部的 this 指向 proxy 而非 target。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











