javascript中对象属性查找默认走原型链,但优先返回自身属性;同名时实例属性屏蔽原型属性,不覆盖不合并:先查自身,无则沿[[prototype]]链向上至object.prototype,最终null终止;delete后恢复原型查找。

JavaScript中对象属性查找默认走原型链,但优先返回自身属性;同名时,实例属性会屏蔽原型上的同名属性,不会覆盖也不会合并。
属性查找过程:从实例到Object.prototype
当读取一个对象的属性时,引擎按顺序检查:
- 先查对象自身是否有该属性(包括直接赋值或构造函数内定义的)
- 如果没有,就顺着
[[Prototype]]链向上找,即通过Object.getPrototypeOf(obj)获取其原型对象,再查该原型上有没有 - 若原型也没有,继续查原型的原型,直到到达
Object.prototype -
Object.prototype的[[Prototype]]为null,查找终止,未找到则返回undefined
同名属性的处理:实例属性优先屏蔽原型属性
如果实例对象和它的原型上存在同名属性,实例自身的属性始终生效,原型上的同名属性被“遮蔽”(shadowing),不会参与查找:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
obj.x = 10后,即使obj.__proto__.x = 5,obj.x仍返回10 -
delete obj.x后,再次访问obj.x才会落到原型上,返回5 -
hasOwnProperty('x')只检测自身属性,返回true或false,不关心原型链 -
'x' in obj会沿原型链查找,只要任一层有x就返回true
方法与数据属性的行为一致,但要注意赋值语义
给对象添加方法或修改属性时,行为取决于是否已存在自身属性:
-
obj.say = function(){}:直接在实例上创建新属性,不影响原型 -
obj.say()调用时,若自身无say,才从原型链中找,比如Person.prototype.say - 不要用
obj.prototype.xxx = ...试图修改原型——实例没有prototype属性;应改Constructor.prototype.xxx或用Object.getPrototypeOf(obj).xxx
验证原型链与属性来源的常用方式
调试时可快速判断属性在哪一层:
-
Object.getPrototypeOf(obj)查看当前原型 -
obj.hasOwnProperty('prop')确认是否为自有属性 -
prop in obj判断是否在实例或原型链上存在 - 浏览器开发者工具中展开
__proto__或使用console.dir(obj)直观查看层级
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










