静态方法属于类本身,通过类名调用,不可访问this和实例成员;实例方法定义在原型上,必须通过实例调用,可通过this访问实例属性和方法。

静态方法属于类本身,不能通过实例调用;实例方法属于类的原型,只能通过实例调用。
静态方法:定义在类上,直接通过类名访问
静态方法使用 static 关键字声明,绑定在构造函数(即类名)上,不依赖实例状态。它无法访问 this(因为没有实例上下文),也不能直接访问实例属性或实例方法。
- 定义方式:class MyClass { static myStaticMethod() { ... } }
- 调用方式:MyClass.myStaticMethod()(✅ 正确)
- 错误调用:new MyClass().myStaticMethod()(❌ 报错,实例上不存在)
- 常见用途:工具函数、工厂方法(如 Date.now()、Array.isArray())
实例方法:定义在原型上,必须通过实例访问
实例方法默认写在类体中(不加 static),会被添加到类的 prototype 上。每个实例共享该方法,可通过 this 访问当前实例的属性和其他实例方法。
- 定义方式:class MyClass { myInstanceMethod() { console.log(this.value); } }
- 调用方式:const inst = new MyClass(); inst.myInstanceMethod()(✅ 正确)
- 错误调用:MyClass.myInstanceMethod()(❌ undefined,类本身没有该方法)
- 注意:this 在实例方法中指向调用它的具体对象,不是类本身
本质区别:存储位置与绑定目标不同
JavaScript 中,类只是函数的语法糖。静态方法是构造函数自身的属性;实例方法是构造函数 prototype 的属性。
- MyClass.myStaticMethod === MyClass.prototype.constructor.myStaticMethod(✅ 同一个函数)
- MyClass.prototype.myInstanceMethod 存在,但 MyClass.myInstanceMethod 为 undefined
- 可验证:console.log(MyClass.hasOwnProperty('myStaticMethod')) // true
- 可验证:console.log(MyClass.prototype.hasOwnProperty('myInstanceMethod')) // true
混用场景:静态方法中创建实例,实例方法中调用静态方法
二者可以协作,但需注意调用路径和上下文。
- 静态方法内可用 new this() 创建实例(this 指向类本身)
- 实例方法中可通过 MyClass.staticMethod() 或 this.constructor.staticMethod() 调用静态方法
- 避免在静态方法中访问 this.xxx(会报错或指向意外对象)
- 示例:class Logger { static create() { return new Logger(); } log() { console.log('log'); } }
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











