JavaScript原型链属性查询从当前对象自有属性开始查找,未命中时沿[[Prototype]]链单向向上遍历至null;自有属性包括不可枚举属性,屏蔽会阻止继续查找,delete可暴露原型同名属性。
JavaScript 原型链属性查询,本质是沿着对象的 [[Prototype]] 链向上逐级查找,直到找到匹配属性名,或到达原型链末端(null)仍未找到,返回 undefined。
查询始终先检查对象自身的属性(包括可枚举和不可枚举的),使用 Object.prototype.hasOwnProperty 或 Object.getOwnPropertyNames 可判断是否为自有属性。只有未命中时,才继续查原型。
[[Prototype]] 链单向向上遍历每个对象内部都有一个隐式原型指针 [[Prototype]](可通过 Object.getPrototypeOf(obj) 或非标准但广泛支持的 obj.__proto__ 访问)。引擎按此链依次访问上一级原型对象,不会横向或回溯。
[[Prototype]] 指向 Function.prototype
Object.prototype
Object.prototype 的 [[Prototype]] 是 null,链在此终止即使属性被定义为 enumerable: false 或 configurable: false,只要存在且可读(writable 或 get 存在),仍能被正常访问。查询算法只认属性名是否存在,不区分描述符细节。
立即学习“Java免费学习笔记(深入)”;
注意:for...in 和 Object.keys() 受 enumerable 控制,但这属于枚举规则,与属性查询算法本身无关。
当子对象自身添加了同名属性,会“遮蔽”原型上的同名属性。查询时优先返回子对象的值,不会继续向上找——这不是覆盖,而是停止查找。删除子对象该属性后,原型上的同名属性才会重新可见。
delete obj.prop 删除自有属性后,可能暴露原型链上的同名属性Object.defineProperty 设置 writable: false 不阻止遮蔽,只限制修改