JavaScript原型链属性查找不执行访问权限校验,仅做存在性与可枚举性检查;私有字段不参与查找,只读/不可配置属性仍可读取,权限控制实际由描述符规则和getter/setter逻辑实现。

JavaScript 中原型链属性查找本身不执行访问权限校验——它只做“可枚举性 + 属性存在性”的朴素查找,不检查 private、# 私有字段、get 访问器的调用权限,也不拦截对不可写/不可配置属性的读取(读取始终允许,写入才受限制)。
原型链查找只关心“能不能找到”,不关心“能不能读”
当访问 obj.prop 时,引擎沿 [[Prototype]] 链向上搜索:从 obj 自身开始,依次检查每个原型对象是否拥有该属性(含继承来的),只要属性存在(即使被 Object.defineProperty 设为 writable: false 或 configurable: false),读取就成功。私有字段(#prop)根本不会出现在原型链中,因为它们不是常规属性,不参与 [[Get]] 的原型遍历。
- 只读属性(
writable: false)可以正常读取,只是赋值会静默失败(严格模式报错) - 不可配置属性(
configurable: false)仍可读取,只是无法 delete 或重新定义 -
get访问器会被调用,但其内部逻辑(如 throw 错误)才是“权限控制点”,不是原型查找机制本身做的校验
真正起访问控制作用的是属性描述符与访问器逻辑
JavaScript 的访问权不在查找路径上校验,而在属性被实际访问或修改时由描述符规则和 getter/setter 执行:
-
Object.defineProperty(obj, 'x', { get() { if (!hasPermission()) throw new Error(); return this._x; } })—— 权限检查发生在 getter 内部 - 类私有字段
#x的访问限制由语法层强制:仅在声明它的类体内可访问,编译期报错,不进入原型链,也不暴露给in、for...in或Object.keys() -
Proxy可拦截get操作,在原型链查找前或后介入,实现自定义访问控制(例如检查调用者上下文)
注意:in 操作符和 Object.getOwnPropertyNames 不走完整原型链
prop in obj 会查整个原型链(含不可枚举属性),但只判断“是否存在”,不触发 getter;而 Object.getOwnPropertyNames(obj) 仅返回对象自身的属性名(不含原型链),且跳过私有字段和不可枚举属性(除非显式用 getOwnPropertyDescriptor)。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
立即学习“Java免费学习笔记(深入)”;
-
hasOwnProperty('prop')仅检查自身,不查原型 -
Reflect.has(obj, 'prop')行为等价于'prop' in obj,同样不校验访问权 - 所有这些操作都不抛错,哪怕目标是私有字段或受保护的 getter —— 因为它们根本“看不见”私有字段,也未执行 getter
总结:查找与访问是两个阶段
原型链负责定位属性位置(Where is it?),而访问控制发生在定位之后的具体操作中(Can I read/write it?)。引擎不会在查找过程中拒绝一个存在的属性,也不会因权限不足跳过某个原型;它只是忠实返回第一个匹配的属性描述符,再根据该描述符的 value/get 等字段决定后续行为。
不复杂但容易忽略。

















