JavaScript 静态方法
静态方法(Static Method)指直接挂在构造函数或类上、无须创建实例就能调用的方法。JavaScript 里常见的内置例子是 Math.max()、Array.isArray()、Date.now()——它们都用"类名.方法()"调用。把与具体实例无关的通用逻辑写成静态方法,代码会更清晰。
为什么要用静态方法
当一个方法不需要读取某个具体对象的属性时,就不必先 new 一个对象。静态方法适合放:工具函数(计算、校验)、工厂方法(帮你生成对象)、常量配置。它的调用形式统一为 类名.方法()。
传统方式:挂在构造函数上
ES6 之前没有 class,函数本身就是"类"。直接在构造函数上添加属性,就得到了静态方法:
function User(name) {
this.name = name;
}
User.create = function (name) { // 定义在 User 上,而不是原型上
return new User(name);
};
User.company = '示例公司'; // 静态属性
var u = User.create('张三'); // 不用 new 也能"造"出对象
console.log(u.name); // 输出:张三
console.log(User.company); // 输出:示例公司
ES6 class 的 static
class 语法用 static 关键字声明静态方法,更直观。静态方法里的 this 指向类本身:
class MathUtil {
static add(a, b) { // static 声明静态方法
return a + b;
}
static version() {
return '1.0';
}
static who() {
return this === MathUtil ? '我是 MathUtil' : '其他';
}
}
console.log(MathUtil.add(2, 3)); // 输出:5
console.log(MathUtil.version()); // 输出:1.0
console.log(MathUtil.who()); // 输出:我是 MathUtil
// 注意:静态方法里没有实例,访问不到 this.name 这类实例属性
内置对象的静态方法
JavaScript 内置了大量静态方法,见名知义:
console.log(Array.isArray([1, 2])); // 输出:true(判断是否为数组)
console.log(Date.now()); // 输出:1750000000000(当前毫秒时间戳)
console.log(Object.keys({ a: 1, b: 2 })); // 输出:[ 'a', 'b' ]
console.log(Math.max(3, 8, 5)); // 输出:8
console.log(Number.isNaN('abc')); // 输出:false(不做类型转换)
静态方法与实例方法对比
| 方式 | 定义位置 | 调用方式 | 能否访问实例数据 |
|---|---|---|---|
| 静态方法 | 类 / 构造函数上 | 类名.方法() | 不能(没有实例) |
| 实例方法 | 原型 prototype 上 | 实例.方法() | 能(this 指向实例) |
选择建议:与单个对象状态无关的通用逻辑用静态方法;需要读写 this 上的数据(如 this.name)时,必须用实例方法。
小结:静态方法挂在类本身上、用"类名.方法()"调用,适合工具函数、工厂方法与内置 API(Math、Array、Date 等)。它与实例方法的本质区别在于:静态方法没有指向实例的 this,因此不能访问实例属性。