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 语法的优势,同时保持对原型机制的理解以应对复杂场景。

相关推荐
IT_陈寒12 分钟前
为什么你应该学习JavaScript?
前端·人工智能·后端
lifejump31 分钟前
Empire(帝国)CMS 7.5 XSS注入
前端·安全·xss
无风听海35 分钟前
OAuth 2.0 前端通道与后端通道深入剖析
前端·oauth
sakiko_36 分钟前
UIKit学习笔记8-发送照片、拍摄照片并发送
前端·swift·uikit
_code_bear_1 小时前
OpenSpec CLI 与 OPSX 工作流说明
前端·后端·架构
AI_paid_community1 小时前
98.5k Star!GitHub官方开源的这个工具,正在把"vibe coding"扫进历史的垃圾桶
javascript·claude
AI_paid_community1 小时前
用 Claude Code 写了一年代码,装了这 18 个 Skills 之后,我才知道自己一直在"氛围编程"
javascript·面试
parade岁月1 小时前
开源一个 Vue 3 Table:API 学 antdv、主题学 Nuxt UI
前端·vue.js
JiaWen技术圈1 小时前
Web 安全深入审计检查清单
前端·安全