一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

JavaScript 原型链属性查询算法:如何描述才准确?

时间:2026-06-17 09:35:58 编辑:袖梨 来源:一聚教程网

JavaScript原型链属性查询从当前对象自有属性开始查找,未命中时沿[[Prototype]]链单向向上遍历至null;自有属性包括不可枚举属性,屏蔽会阻止继续查找,delete可暴露原型同名属性。

JavaScript 原型链属性查询,本质是沿着对象的 [[Prototype]] 链向上逐级查找,直到找到匹配属性名,或到达原型链末端(null)仍未找到,返回 undefined

从当前对象开始,不跳过自有属性

查询始终先检查对象自身的属性(包括可枚举和不可枚举的),使用 Object.prototype.hasOwnPropertyObject.getOwnPropertyNames 可判断是否为自有属性。只有未命中时,才继续查原型。

沿 [[Prototype]] 链单向向上遍历

每个对象内部都有一个隐式原型指针 [[Prototype]](可通过 Object.getPrototypeOf(obj) 或非标准但广泛支持的 obj.__proto__ 访问)。引擎按此链依次访问上一级原型对象,不会横向或回溯。

  • 函数对象的 [[Prototype]] 指向 Function.prototype
  • 普通对象默认指向 Object.prototype
  • Object.prototype[[Prototype]]null,链在此终止

属性描述符影响读取行为,但不改变查询路径

即使属性被定义为 enumerable: falseconfigurable: false,只要存在且可读(writableget 存在),仍能被正常访问。查询算法只认属性名是否存在,不区分描述符细节。

立即学习“Java免费学习笔记(深入)”;

注意:for...inObject.keys()enumerable 控制,但这属于枚举规则,与属性查询算法本身无关。

屏蔽(shadowing)是常见干扰点

当子对象自身添加了同名属性,会“遮蔽”原型上的同名属性。查询时优先返回子对象的值,不会继续向上找——这不是覆盖,而是停止查找。删除子对象该属性后,原型上的同名属性才会重新可见。

  • delete obj.prop 删除自有属性后,可能暴露原型链上的同名属性
  • Object.defineProperty 设置 writable: false 不阻止遮蔽,只限制修改

热门栏目