元素码农
基础
UML建模
数据结构
算法
设计模式
网络
TCP/IP协议
HTTPS安全机制
WebSocket实时通信
数据库
sqlite
postgresql
clickhouse
后端
rust
go
java
php
mysql
redis
mongodb
etcd
nats
zincsearch
前端
浏览器
javascript
typescript
vue3
react
游戏
unity
unreal
C++
C#
Lua
App
android
ios
flutter
react-native
安全
Web安全
测试
软件测试
自动化测试 - Playwright
人工智能
Python
langChain
langGraph
运维
linux
docker
工具
git
svn
🌞
🌙
目录
▶
执行上下文
▶
创建过程
变量对象
作用域链
This绑定
▶
执行阶段
执行栈机制
词法环境
闭包实现
▶
内存管理
▶
内存模型
堆栈结构
内存分配
内存泄漏
▶
回收机制
标记清除
引用计数
代际假说
▶
事件循环
▶
运行机制
调用栈解析
任务队列
微任务优先
▶
异步处理
Promise原理
Async/Await
Web Workers
▶
原型系统
▶
原型基础
原型链机制
__proto__属性
构造函数
▶
类继承
ES6类语法
继承实现
super关键字
▶
类型系统
▶
基础类型
类型检测
装箱拆箱
类型转换
▶
高级类型
Symbol特性
BigInt实现
类型数组
▶
作用域与闭包
▶
作用域体系
词法作用域
动态作用域
作用域链生成
▶
闭包机制
闭包存储结构
IIFE模式原理
内存泄漏防范
发布时间:
2025-03-22 11:45
↑
☰
# JavaScript ES6类语法详解 ES6引入的class语法为JavaScript提供了更清晰的面向对象编程方式。本文将深入讲解ES6类的语法特性、继承机制和最佳实践。 ## 类的基本语法 ES6的class语法提供了一种更直观的方式来创建对象和实现继承。 ```javascript // 基本类定义 class Animal { constructor(name) { this.name = name; } speak() { console.log(`${this.name} makes a sound`); } } const dog = new Animal('Dog'); dog.speak(); // "Dog makes a sound" ``` ## 类的组成部分 ### 1. 构造方法 ```javascript class Constructor { static demonstrate() { class Person { constructor(name, age) { // 实例属性初始化 this.name = name; this.age = age; // 私有属性 this._id = Math.random(); } // 实例方法 getInfo() { return `${this.name} is ${this.age} years old`; } } const person = new Person('John', 30); console.log(person.getInfo()); } } ``` ### 2. 实例属性和方法 ```javascript class InstanceMembers { // 实例属性 name = ''; age = 0; // 私有字段 #privateField = 'private'; constructor(name, age) { this.name = name; this.age = age; } // 实例方法 sayHello() { console.log(`Hello, I'm ${this.name}`); } // 私有方法 #privateMethod() { return this.#privateField; } // 访问私有成员的公共方法 getPrivateData() { return this.#privateMethod(); } } ``` ### 3. 静态成员 ```javascript class StaticMembers { // 静态属性 static count = 0; // 静态私有字段 static #instances = new Set(); constructor() { StaticMembers.count++; StaticMembers.#instances.add(this); } // 静态方法 static getCount() { return StaticMembers.count; } // 静态私有方法 static #cleanupInstances() { StaticMembers.#instances.clear(); } // 工厂方法 static create() { return new StaticMembers(); } } ``` ## 类的继承 ### 1. extends关键字 ```javascript class Inheritance { static demonstrate() { class Animal { constructor(name) { this.name = name; } speak() { console.log(`${this.name} makes a sound`); } } class Dog extends Animal { constructor(name, breed) { super(name); this.breed = breed; } speak() { console.log(`${this.name} barks`); } fetch() { console.log(`${this.name} fetches the ball`); } } const dog = new Dog('Rex', 'German Shepherd'); dog.speak(); // "Rex barks" dog.fetch(); // "Rex fetches the ball" } } ``` ### 2. super关键字 ```javascript class SuperKeyword { static demonstrate() { class Base { constructor(value) { this.value = value; } getValue() { return this.value; } } class Derived extends Base { constructor(value, extra) { // 调用父类构造函数 super(value); this.extra = extra; } getValue() { // 调用父类方法 const baseValue = super.getValue(); return `${baseValue} + ${this.extra}`; } } const derived = new Derived(5, 10); console.log(derived.getValue()); // "5 + 10" } } ``` ## 访问器属性 ```javascript class Accessors { constructor() { this._value = 0; } // getter get value() { return this._value; } // setter set value(newValue) { if (newValue >= 0) { this._value = newValue; } } static demonstrate() { const acc = new Accessors(); acc.value = 10; // 使用setter console.log(acc.value); // 使用getter } } ``` ## 最佳实践 ### 1. 类的组织 ```javascript class Organization { static demonstrate() { // 好的实践 - 类的职责单一 class UserService { #api; #cache; constructor(api, cache) { this.#api = api; this.#cache = cache; } async getUser(id) { // 先检查缓存 const cached = this.#cache.get(id); if (cached) return cached; // 从API获取 const user = await this.#api.fetchUser(id); this.#cache.set(id, user); return user; } } // 不好的实践 - 类承担过多职责 class BadUserService { constructor() { this.users = []; this.logs = []; this.cache = new Map(); } // 混合了数据访问、缓存、日志等多个职责 async getUser(id) {} logAction(action) {} clearCache() {} } } } ``` ### 2. 继承最佳实践 ```javascript class InheritanceBestPractices { static demonstrate() { // 好的实践 - 组合优于继承 class Logger { log(message) { console.log(message); } } class HttpClient { constructor(logger) { this.logger = logger; } async fetch(url) { this.logger.log(`Fetching ${url}`); // 执行请求 } } // 不好的实践 - 过度继承 class LoggableHttpClient extends Logger { async fetch(url) { this.log(`Fetching ${url}`); // 执行请求 } } } } ``` ## 总结 ES6类语法提供了: 1. 更清晰的面向对象编程方式 2. 类的封装和继承机制 3. 静态成员和私有成员支持 4. 访问器属性 在使用ES6类时,我们应该: 1. 理解类的基本语法 2. 正确使用继承 3. 合理组织类的结构 4. 遵循最佳实践 5. 优先使用组合而非继承