静态属性只属于构造函数本身,实例属性存在于实例自身,原型属性才参与原型链查找;三者互不干扰,分别对应工厂门牌号、机器标签和共用图纸。

静态属性和实例属性在原型链中根本不在同一条查找路径上——它们压根不参与彼此的查找过程。
静态属性只属于构造函数本身
静态属性直接挂在构造函数(类)上,比如 Person.count = 0 或 class Person { static version = '1.0' }。它既不被实例继承,也不进入原型链查找机制。
- 只能通过
Person.count或Person.version访问 -
new Person().count返回undefined,哪怕实例上没定义该属性,也不会向上找静态属性 - 静态属性常用于工具方法、版本标识、计数器等与具体实例无关的场景
实例属性优先存在于实例自身
实例属性是在构造函数内部用 this.xxx = ... 定义的,比如 this.name = 'Alice'。每次 new 都会为每个实例单独创建一份。
- 访问时先查实例自身,有就直接返回,不会继续往原型链上找
- 即使原型上也有同名属性(如
Person.prototype.name),也会被实例属性屏蔽 - 修改实例属性不会影响其他实例,也不会改变原型上的值
原型属性才是原型链查找的主角
真正参与原型链查找的是定义在 prototype 上的属性或方法,比如 Person.prototype.sayName = function(){...}。
- 当访问
person.sayName且实例自身没有该属性时,引擎自动沿__proto__向上查找 - 所有实例共享同一份原型属性,节省内存;但要注意:如果给实例赋值同名属性(如
person.sayName = ...),就会遮蔽原型上的定义 - 静态属性和实例属性都不在这个查找链里——一个太高(只属构造函数),一个太近(只属当前对象)
三者关系一目了然
可以这样理解:构造函数像一间工厂,静态属性是工厂大楼的门牌号,实例属性是每台出厂机器贴的编号标签,原型属性则是工厂共用的设计图纸。图纸能被所有机器参考,门牌号不属于任何一台机器,标签也互不干扰。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











