静态属性直接绑定在类构造函数上,不属于原型链或实例对象;它在类定义时初始化,可通过类名访问,子类可遮蔽但不覆盖父类静态属性。

静态属性直接绑定在类构造函数本身上,不是原型链的一部分,也不是实例对象的属性。
静态属性属于构造函数对象
JavaScript 中的类本质是函数,而 static 声明的属性会作为属性直接挂载到该类(即构造函数)上。它不参与原型继承,也不出现在实例或 prototype 上。
- 例如
class Animal { static species = 'Mammal'; },Animal.species可立即访问,但new Animal().species是undefined - 可通过
Animal.hasOwnProperty('species')返回true验证它确实是构造函数自身的自有属性 - 它和
Animal.prototype完全无关,修改Animal.prototype不会影响静态属性
构造函数初始化时静态属性已就位
类定义执行时,静态属性就会被赋值——不需要实例化,也不依赖 constructor 执行。
- 即使类中没有
constructor,静态属性依然存在并可访问 - 静态属性的初始化发生在类声明求值阶段,早于任何实例创建
- 若使用公有静态字段语法(如
static version = '1.0'),其赋值行为与普通变量声明一致,作用域限定在类体内
与 constructor 的关系是“共存”而非“依赖”
constructor 负责初始化实例,静态属性负责提供类层面的配置或工具数据,二者职责分离,无调用或执行依赖。
-
constructor内不能通过this访问静态属性(this指向实例,而静态属性在构造函数上) - 若需在构造函数中读取静态属性,必须显式通过类名访问,如
Animal.species - 静态属性可以被
constructor读取或用于实例初始化逻辑,但不是由constructor创建或定义的
子类继承时静态属性绑定目标不变
子类继承父类后,父类的静态属性仍绑定在父类构造函数上;子类可定义同名静态属性,形成遮蔽,但不会覆盖父类上的原始属性。
-
class Dog extends Animal {}后,Dog.species实际读取的是Animal.species(因未重定义) - 若
class Dog extends Animal { static species = 'Canine'; },则Dog.species指向新值,Animal.species保持不变 - 这种绑定关系由 JavaScript 引擎在类声明解析阶段确定,不可运行时转移
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











