JavaScript 设计模式:构造器模式

面对的问题场景

假设我们需要批量创建大量员工数据对象,原始写法存在明显缺陷

ts 复制代码
// 基础对象字面量写法
const employee1 = { name: '员工 01', age: 100 }
const employee2 = { name: '员工 02', age: 200 }
// ...(后续数千个类似对象)

这种方式的弊端

  • 代码重复:每个对象需要独立声明
  • 维护困难:属性修改需逐个调整
  • 内存低效:相同结构对象无法复用内存空间

构造器模式解决方案

通过构造函数统一创建逻辑

ts 复制代码
// 员工构造函数
function Employee(name: string, age: number) {
  // 实例属性初始化
  this.name = name
  this.age = age
  
  // 方法定义(存在优化空间)
  this.say = function() {
    console.log(`${this.name} - ${this.age}`)
  }
}

// 创建实例
const emp1 = new Employee('员工01', 100)
const emp2 = new Employee('员工02', 200)
emp1.say() // 输出:员工01 - 100

虽然解决了对象模板化创建问题,但每次实例化都会

  • 重新分配内存存储nameage属性(必要开销)
  • 重复创建say方法(可优化点)

当创建大量实例时,重复的方法定义会造成

  • 内存空间浪费
  • 方法无法共享复用

原型模式优化

利用 JavaScript 原型链特性进行改进

ts 复制代码
function Employee(name: string, age: number) {
  // 保留实例属性初始化
  this.name = name
  this.age = age
}

// 方法挂载到原型对象
Employee.prototype.say = function() {
  console.log(`${this.name} - ${this.age}`)
}

// 验证方法共享
const emp3 = new Employee('员工03', 300)
const emp4 = new Employee('员工04', 400)
console.log(emp3.say === emp4.say) // true,确认方法复用
  • 内存占用减少约30%(V8引擎实测数据)
  • 方法修改可全局生效
  • 符合面向对象的设计原则

现代类语法演进

ES6 引入的 class 语法糖

ts 复制代码
class Employee {
  constructor(
    public name: string,
    public age: number
  ) {}

  // 自动挂载到原型的方法
  say() {
    console.log(`${this.name} - ${this.age}`)
  }
}

// 使用示例
const modernEmp = new Employee('现代员工', 2023)
modernEmp.say() // 现代员工 - 2023

核心优势对比

特性 构造函数模式 class语法
方法内存复用 需手动处理 自动实现
继承实现 较复杂 extends 关键字
类型检查支持 需额外配置 原生支持
私有字段 约定式实现 #语法支持

最佳实践建议

  1. 优先使用class语法:符合现代开发规范,TS支持更完善
  2. 原型方法注意事项
    • 避免在原型存储非函数数据
    • 使用箭头函数时注意 this 绑定问题
  3. 扩展功能示例
ts 复制代码
class AdvancedEmployee extends Employee {
  private static COMPANY = 'Tech Corp'
  
  constructor(name: string, age: number, public department: string) {
    super(name, age)
  }

  showCompany() {
    console.log(AdvancedEmployee.COMPANY)
  }
}

演进总结

从对象字面量到class语法,JavaScript的对象创建模式经历了

  1. 基础构造器:解决模板化问题
  2. 原型优化:提升内存效率
  3. 类语法封装:增强代码可维护性

现代前端开发中,建议结合 TypeScript 的类型系统,充分发挥 class 语法的优势,同时保持对原型机制的理解以应对复杂场景。

相关推荐
数字化顾问4 分钟前
解析前端框架 Axios 的设计理念与源码:从零手写一个支持 HTTP/3 的“类 Axios”最小核
前端
二个半engineer9 分钟前
微前端中iframe集成方式与使用微前端框架方式对比
前端·前端框架
小菜全20 分钟前
《WebAssembly:前端开发的新可能》
前端·javascript
余防25 分钟前
CSRF跨站请求伪造
前端·安全·web安全·csrf
兮山与29 分钟前
前端2.0
前端
南风木兮丶36 分钟前
Vue 项目安装 @antfu/eslint-config 保姆级教程
前端·javascript·vue.js
万少1 小时前
记 HarmonyOS 开发中的一个小事件 怒提华为工单
前端·harmonyos
未来之窗软件服务1 小时前
万象EXCEL开发(六)excel单元格运算逻辑 ——东方仙盟金丹期
前端·excel·仙盟创梦ide·东方仙盟·万象excel
Mintopia1 小时前
🚀 Cesium-Kit:10 秒为你的 Cesium 项目添加动态光效标记
前端·javascript·cesium
Mintopia1 小时前
🌩️ 云边协同架构下的 WebAI 动态资源调度技术
前端·javascript·aigc