javascript的class是基于原型的语法糖,需constructor初始化实例,支持实例/静态方法、extends继承(须super调用父构造)、#私有成员(es2022+)。

JavaScript 中用 class 语法实现面向对象编程,本质是基于原型(prototype)的语法糖,写法更接近传统 OOP 语言(如 Java、C++),但底层机制没变。它让构造函数、原型方法、继承等操作更清晰、更易读。
定义类和构造函数
class 声明必须包含一个名为 constructor 的方法,用于初始化实例属性。没有 constructor 时,JavaScript 会自动提供一个空构造函数。
- 类名通常首字母大写(约定,非强制)
- 不能像函数那样被提升(
class是块级作用域且不提升) - 直接调用类(不加
new)会报错
示例:
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
}
const p = new Person('Alice', 30); // ✅ 正确
// Person('Bob', 25); // ❌ 报错:Class constructor Person cannot be invoked without 'new'添加实例方法和静态方法
方法默认定义在类的原型上,即所有实例共享;而 static 方法属于类本身,不能通过实例调用。
- 实例方法可访问
this(指向当前实例) - 静态方法常用于工具函数或工厂逻辑,比如
Date.now()、Array.from()
示例:
class Person {
constructor(name) {
this.name = name;
}
<p>// 实例方法 → 在 Person.prototype 上
greet() {
return <code>Hello, I'm ${this.name}</code>;
}</p><p>// 静态方法 → 在 Person 类上
static createAnonymous() {
return new Person('Anonymous');
}
}</p><p>const p = new Person('Tom');
console.log(p.greet()); // "Hello, I'm Tom"
console.log(Person.createAnonymous()); // Person { name: 'Anonymous' }
// p.createAnonymous(); // ❌ TypeError</p>使用 extends 实现继承
子类通过 extends 继承父类,必须在 constructor 中第一行调用 super()(否则无法访问 this),用于初始化父类的实例属性。
-
super()调用父类构造函数;super.xxx可访问父类的静态成员或原型方法 - 子类可以重写父类方法,也可用
super.methodName()在重写中调用父类版本
示例:
class Animal {
constructor(name) {
this.name = name;
}
speak() {
return `${this.name} makes a sound`;
}
}
<p>class Dog extends Animal {
constructor(name, breed) {
super(name); // ✅ 必须先调用 super
this.breed = breed;
}
speak() {
return super.speak() + ' — Woof!'; // ✅ 复用父类逻辑
}
}</p><p>const dog = new Dog('Max', 'Golden Retriever');
console.log(dog.speak()); // "Max makes a sound — Woof!"</p>私有字段与方法(ES2022+)
用 # 前缀声明真正私有的字段/方法,仅在类内部可访问,外部和子类都无法读取或调用。
- 私有字段必须在类体中声明(即使初始值为
undefined) - 不能在子类中访问父类的私有成员(连
super.#xxx也不行) - 这是语言级封装,比下划线约定(
_name)更可靠
示例:
class Counter {
#count = 0; // 私有字段
<p>increment() {
this.#count++;
}</p><p>getCount() {
return this.#count;
}</p><p>// #reset() { ... } // 私有方法(同样以 # 开头)
}</p><p>const c = new Counter();
c.increment();
console.log(c.getCount()); // 1
// console.log(c.#count); // ❌ SyntaxError</p>Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











