静态方法用static声明,属于类而非实例,不可通过this访问实例属性或方法,只能通过类名调用;可被子类继承和重写,支持super调用父类静态方法;不能是箭头函数;与静态属性初始化时机不同。

静态方法用 static 关键字声明,不能访问 this
类中定义静态方法只需在方法前加 static,它属于类本身而非实例。这意味着你无法在静态方法里用 this 访问实例属性或方法,this 指向的是类(如 MyClass),不是实例对象。
常见错误是误以为静态方法能直接读取 this.name 或调用 this.instanceMethod()——这会报 undefined 或 is not a function 错误。
- 静态方法适合封装与类相关但不依赖实例状态的逻辑,比如工厂函数、类型校验、工具转换
- 不能通过实例调用:
new MyClass().staticMethod()会报错 - 必须通过类名调用:
MyClass.staticMethod()
static 方法可被子类继承,也能被重写
子类默认继承父类的静态方法,行为和普通方法继承一致。如果子类定义同名 static 方法,就会覆盖父类版本,且 super 在静态上下文中仍可用。
注意:子类静态方法里的 super 指向父类(不是父类原型),所以 super.staticMethod() 是合法的。
立即学习“Java免费学习笔记(深入)”;
功能列表:底层程序与前台页面分离的效果,对页面的修改无需改动任何程序代码。完善的标签系统,支持自定义标签,公用标签,快捷标签,动态标签,静态标签等等,支持标签内的vbs语法,原则上运用这些标签可以制作出任何想要的页面效果。兼容原来的栏目系统,可以很方便的插入一个栏目或者一个栏目组到页面的任何位置。底层模版解析程序具有非常高的效率,稳定性和容错性,即使模版中有错误的标签也不会影响页面的显示。所有的标
- 父类
Animal.count()返回 0,子类Dog.count()可返回特定计数 - 若需复用父类逻辑,用
super.staticMethod()显式调用 - 箭头函数不能用作静态方法——它没有自己的
this,也不支持super
静态方法 vs 静态属性:初始化时机不同
static 属性在类定义时执行赋值(类似模块顶层代码),而 static 方法只是声明,不立即执行。这点影响初始化顺序和副作用控制。
例如:static cache = new Map() 会在类加载时创建新 Map;但 static getCache() 不会自动运行,必须显式调用。
- 避免在静态属性初始化中调用尚未定义的静态方法(JS 按声明顺序解析,非提升)
- 若需延迟初始化,用静态 getter:
static get cache() { return this._cache ?? (this._cache = new Map()) } - Node.js 中多个
require同一模块,静态属性只初始化一次;浏览器 ESM 多次import也共享同一类对象
调用时别混淆 new 和直接类名调用
这是最常踩的坑:把静态方法当构造函数用,或者漏掉类名直接写方法名。
错误示例:MyClass() // TypeError: Class constructor MyClass cannot be invoked without 'new';staticMethod() // ReferenceError: staticMethod is not defined。
- 正确调用格式只有这一种:
MyClass.staticMethodName(arg1, arg2) - 可在模块顶层、事件回调、甚至另一个静态方法内部调用,只要作用域能访问到类名
- 如果类是默认导出,确保导入时用了正确名称:
import MyClass from './MyClass.js',而不是import { MyClass } from
this 绑定、继承链调用、模块导入导出这几处出问题。尤其多人协作时,有人在静态方法里偷偷改实例状态,会导致难以追踪的隐性 bug。









