静态属性属于构造函数自身,不参与原型链查找,直接挂载在函数对象上,无法通过实例或其原型链访问,检测需直接操作构造函数。

静态属性不在原型链上,它根本就不是原型链的一部分。
静态属性属于构造函数自身
静态属性(包括静态方法)直接作为属性挂载在构造函数(或类)这个函数对象上,和实例对象、原型对象都无关。比如:
-
class Person { static version = '1.0' }→Person.version可直接访问 -
Person.version的存储位置是函数对象Person在堆内存中的自有属性 - 它不会出现在
new Person().__proto__链上,也不在Person.prototype上
原型链只负责实例共享行为
原型链(__proto__ 链)的作用是让实例对象能共享定义在 prototype 上的属性和方法。例如:
-
Person.prototype.sayHi = function(){}→ 所有new Person()实例可通过.sayHi()调用 - 这个
sayHi存在Person.prototype对象中,而Person.prototype是new Person()实例的__proto__ - 但
Person.version和这条链完全不相交
检测静态属性不能靠原型链查找
想确认一个属性是不是静态的,不能用 in 或 hasOwnProperty 查实例,而要直接查构造函数:
- ✅ 正确:
Object.prototype.hasOwnProperty.call(Person, 'version')返回true - ❌ 错误:
'version' in new Person()返回false(因为不在实例或其原型链上) - ❌ 错误:
new Person().hasOwnProperty('version')返回false
静态属性与继承的关系很弱
子类不会自动继承父类的静态属性,除非显式设置或建立构造函数间的原型关系:
-
class Student extends Person {}→Student.version是undefined - 若需继承,得手动赋值:
Student.version = Person.version,或用Object.setPrototypeOf(Student, Person) - 这和原型链上的方法自动可继承(如
Person.prototype.sayHi在Student实例上可用)形成鲜明对比
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











