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

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

  • 重新分配内存存储name和age属性(必要开销)
  • 重复创建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 语法的优势,同时保持对原型机制的理解以应对复杂场景。

相关推荐
架构技术专栏11 小时前
Agent 工具调用:从工具声明到执行反馈
前端·人工智能·后端
别动我齐刘海12 小时前
C++ 工程化学习
java·linux·前端·c++·学习·机器学习·机器人
志尊宝12 小时前
Vue3 零基础每日笔记(071):暗黑模式与主题切换——CSS 变量 + Element Plus 暗黑方案
前端·css·笔记·vue·html·前端开发·软件开发
刘发财13 小时前
前端如何生成10000页PDF文件?
前端·javascript·开源
A接拉起00713 小时前
2026 年 JavaScript 开发者需要了解的知识
前端·javascript·后端
_馒头13 小时前
pixiJs游戏开发实践 - 跳棋小游戏
javascript·vue.js
用户114818678948414 小时前
面试官:大屏项目里十几个模块同时渲染上万条数据,怎么做到不卡?
前端·性能优化
前端市界14 小时前
Pro React Admin: 统一工程底座,承载多种应用...
前端·github
葡萄城技术团队14 小时前
dsh-spreadjs-editor 当前支持什么:安装前需要了解的几件事
前端
三*一14 小时前
优化修整算法
前端·javascript·算法