使用 class 关键字定义类,并在构造函数中通过 this 绑定属性。将传统构造函数中的参数赋值逻辑直接写入 constructor() 方法中,即可实现完全相同的实例化行为。

如何将构造函数转换为 class 语法
将构造函数体中的属性赋值语句提取到 constructor 方法内。传统写法需要手动处理原型链和构造函数调用,而 class 语法通过 constructor 自动完成这些底层操作,同时保持 new 关键字的调用方式不变。

function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.greet = function() {
return `Hello, I am ${this.name}`;
};
const p = new Person('Alice', 30);
console.log(p.greet()); // Hello, I am Alice
上述代码展示了传统构造函数及其原型方法的定义方式。转换后的 class 语法如下:
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
greet() {
return `Hello, I am ${this.name}`;
}
}
两者在运行时产生的对象结构完全一致。class 只是构造函数的语法糖,简化了原型链的管理。
静态方法与私有字段的支持情况
class 语法原生支持 static 方法和 # 私有字段,这是传统构造函数难以优雅实现的特性。静态方法直接挂载在构造函数上,而私有字段通过名称前缀 # 实现真正的封装,外部无法访问。

class Counter {
#count = 0;
static incrementBy(base, amount) {
return base + amount;
}
increment() {
this.#count++;
return this.#count;
}
}
console.log(Counter.incrementBy(5, 3)); // 8
const c = new Counter();
c.increment(); // 1
// c.#count; // SyntaxError: Private field '#count' must be declared in an enclosing class
在传统构造函数中,静态方法需手动添加到构造函数对象上,如 Person.staticMethod = ...。而私有字段在传统模式下通常通过闭包或 WeakMap 模拟,class 语法提供了更简洁且安全的原生支持。
继承机制的具体差异与 super 调用
在子类构造函数中必须首先调用 super() 才能访问 this。传统构造函数继承需要手动调用父类构造函数并绑定 this,而 class 语法通过 extends 和 super 自动处理原型链连接和上下文绑定。
class Student extends Person {
constructor(name, age, grade) {
super(name, age); // 必须在此处调用 super
this.grade = grade;
}
greet() {
return `${super.greet()}, Grade: ${this.grade}`;
}
}
若省略 super() 调用,JavaScript 引擎会抛出 ReferenceError。这是因为子类实例的创建依赖于父类对 this 的初始化。传统写法中,开发者需手动执行 Person.call(this, name, age) 并完成原型链设置,容易出错且代码冗长。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











