JavaScript 中的类是 ES6 引入的语法糖,本质仍是基于原型的构造函数机制;它提升可读性与一致性,但不改变底层逻辑,需理解其与原型链的对应关系才能真正用好。
JavaScript 中的 类(class) 是 ES6 引入的语法糖,本质上仍是基于原型的构造函数机制,它本身不改变底层运行逻辑,只是让面向对象写法更清晰、更接近传统语言(如 Java、C++)的风格。
使用 class 关键字声明,内部用 constructor 定义初始化逻辑,其他方法直接写在类体中(无需 function 关键字):
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
sayHello() {
return `Hello, I'm ${this.name}`;
}
static createAdult(name) {
return new Person(name, 18);
}
}
注意:类声明不会被提升(hoisting),必须先定义后使用;类内部方法默认不可枚举;类必须用 new 调用,不能直接执行。
类在底层会被编译为等价的构造函数+原型赋值代码。比如上面的 Person 类,大致等同于:
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.sayHello = function() {
return `Hello, I'm ${this
.name}`;
};
Person.createAdult = function(name) {
return new Person(name, 18);
};
constructor 对应构造函数本身prototype 上new class {...} 和 new function(){...} 都会创建实例并绑定原型链prototype,也省去重复写 function
static、extends、super 等关键字让继承、静态成员、父类调用更直观constructor 或通过字段声明语法 prop = value)Parent.call(this) + Object.setPrototypeOf(Child.prototype, Parent.prototype);类用 extends + super(),更安全且强制要求子类 constructor 调用 super
不是必须用类才能写面向对象代码,但以下情况推荐使用:
extends 比手动设置原型链更可靠)@readonly)、私有字段(#field)等新特性时(这些只支持类语法)基本上就这些。类不是新机制,而是让老机制更好用的那层“糖”。理解它背后仍是构造函数和原型链,才能真正用好它。