Reflect.get()可沿原型链安全读取属性,等价于target[propertyKey]但更可控,需传入receiver确保this绑定正确,属性不存在时返回undefined。

Reflect 本身不直接“获取原型链上的属性”,但它提供了安全、标准的方式让属性访问沿着原型链进行——核心是 Reflect.get(),配合正确的参数使用。
用 Reflect.get 沿原型链读取属性
Reflect.get(target, propertyKey, receiver) 会按 JavaScript 原型链规则查找属性:先查对象自身,再逐级向上查原型,直到找到或到达 null。它等价于 target[propertyKey],但更可控、更安全。
- 它自动处理 getter、继承的方法、访问器属性,并正确绑定 this(关键靠 receiver)
- receiver 参数必须传入当前操作对象(如 Proxy 实例),否则方法调用时 this 可能指向原始 target,导致逻辑错误或权限绕过
- 属性不存在时返回 undefined,不会报错——这是设计使然,不是缺陷
区分“自有”和“继承”的属性来源
仅靠 Reflect.get 返回值无法判断属性来自哪一层。要确认是否来自原型链,需额外检查:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
!target.hasOwnProperty(propertyKey)→ 属性不在自身上 -
propertyKey in target或Reflect.has(target, propertyKey)→ 属性存在于自身或原型链 - 两者同时为真,说明属性只在原型链上(非自有)
配合 Proxy 实现受控继承访问
当需要对原型链上的敏感属性(如 password、token)做拦截或脱敏时,Proxy + Reflect.get 是标准组合:
立即学习“Java免费学习笔记(深入)”;
- 在 get 拦截器中先用
Object.prototype.hasOwnProperty.call(target, prop)判断是否自有 - 若非自有,再结合
prop in target确认是否继承而来 - 命中敏感字段时,可返回脱敏值;否则调用
Reflect.get(target, prop, receiver)正常委托 - 这样既保留原型链语义,又实现细粒度控制
注意边界情况
以下情况容易出错,需提前规避:
- target 为 null 或 undefined 时,Reflect.get 直接抛 TypeError —— 使用前应校验
- 原始值(如字符串、数字)会被自动装箱,但建议避免对原始值调用,语义不清
- Symbol 属性同样沿原型链查找,Reflect.get 支持,无需特殊处理
- 不要误用 Reflect.getOwnPropertyDescriptor() 或 Reflect.getPrototypeOf() 替代属性读取——前者只查自身描述符,后者只返回直接原型

















