广告

JavaScript 类怎么用?详解 class 与构造函数的区别及实战应用

1. JavaScript 类的基本用法

1.1 概念与语法

JavaScript 类提供了一种更清晰的方式来定义对象模板,使用 class 声明和 constructor 进行实例初始化。通过这种写法,代码的可读性和可维护性得到显著提升。

在一个 类的实例 中,方法通常定义在类的原型上,这样所有实例就可以共享这些行为,从而实现内存效率和统一的行为模型。

1.2 一个最小的示例

下面展示一个最小的类,用于创建带有名字的对象,并定义一个方法来输出自我介绍。

class Person {constructor(name) {this.name = name;}introduce() {return `我是 ${this.name}`;}
}
const bob = new Person('Bob');
console.log(bob.introduce());

2. class 与构造函数的区别

2.1 传统构造函数 vs class 语法

在旧的实现中,使用 构造函数 + 原型 的组合来实现对象创建与方法复用。相比之下,ES6 class 提供更加直观的语法糖,便于阅读和维护。

需要注意的是,类声明存在提升,与普通函数的提升行为不同,通常在代码执行时才会被解析,避免了在声明之前调用的风险。

// 构造函数方式
function User(name) {this.name = name;
}
User.prototype.greet = function() {return `Hello, ${this.name}`;
};// class 方式
class UserClass {constructor(name) {this.name = name;}greet() {return `Hello, ${this.name}`;}
}

2.2 继承与多态

类语法引入了
extendssuper,使得子类能够轻松复用父类的属性与方法,并覆盖父类行为以实现多态。

class Animal {constructor(name) {this.name = name;}speak() {console.log(`${this.name} makes a noise.`);}
}
class Dog extends Animal {constructor(name) {super(name);}speak() {console.log(`${this.name} barks.`);}
}

2.3 静态成员与私有字段

静态成员属于类本身,而不是某个实例,适合实现工具函数、计数器等场景。私有字段使用 # 前缀,能更好地实现封装。

class MathUtil {static add(a, b) { return a + b; }
}
console.log(MathUtil.add(2,3)); // 5class BankAccount {#balance;constructor(balance) {this.#balance = balance;}getBalance() {return this.#balance;}
}

3. 实战应用场景:如何在项目中使用类来组织代码

3.1 数据模型与 API 客户端

使用类来建模后端数据模型,能把字段、校验和序列化逻辑集中管理,提升代码可维护性与一致性。

通过实现一个 UserModel 和一个 ApiClient,可以把网络请求与数据解析解耦,形成清晰的数据流。

class UserModel {constructor({ id, name, email }) {this.id = id;this.name = name;this.email = email;}toJSON() {return { id: this.id, name: this.name, email: this.email };}
}
class ApiClient {constructor(baseURL) {this.baseURL = baseURL;}async fetchUser(id) {const res = await fetch(`${this.baseURL}/users/${id}`);const data = await res.json();return new UserModel(data);}
}

3.2 UI 组件建模与状态管理

类可以将 UI 组件的行为抽象成对象,提供 getter/setter、事件绑定、以及简单的状态管理能力,从而实现更易维护的前端组件。

class ButtonState {constructor(label) {this.label = label;this._disabled = false;}get disabled() { return this._disabled; }set disabled(v) { this._disabled = v; }render() {// 假设进行 DOM 操作console.log(``);}
}

3.3 工厂模式与单例模式的结合

通过类实现工厂函数与单例模式,结合静态方法实现全局唯一对象的创建与管理,是实际项目中常见的设计方式。

class Logger {constructor() { if (Logger.instance) return Logger.instance; Logger.instance = this; }log(msg) { console.log(msg); }static getInstance() {if (!Logger.instance) Logger.instance = new Logger();return Logger.instance;}
}
const logger = Logger.getInstance();

4. 兼容性与开发工具

4.1 浏览器与节点环境

现代浏览器和 Node.js 对 ES6+ class 的支持越来越完善,通常无需额外实现就可以直接使用,但在老旧运行环境中需要通过 构建工具(如 Babel)转译。

为了兼容性,可以在关键点使用传统的 构造函数 + 原型方式作为回退方案,确保核心逻辑仍然可用。

// 环境检测简例,提示是否需要转译
try {new Function('(a) => a');// 如果不报错,说明支持现代语法
} catch (e) {// 需要回退到早期实现
}

4.2 开发工具与代码组织

在团队协作中,使用模块化、命名清晰的类有助于职责分离和单元测试。结合类型检查(如 TypeScript)也可以进一步提升可维护性。

常见做法包括把实体模型、服务层、以及 UI 组件的逻辑分别放在不同的类中,形成清晰的职责边界。

JavaScript 类怎么用?详解 class 与构造函数的区别及实战应用

// 简单的模块化示例(假设在 ESM 或打包工具中使用)
export class UserModel { /* ... */ }
export class ApiClient { /* ... */ }

广告