原型设计模式在Js中的使用

原型设计模式

定义

  • 一种创建对象的设计模式,它允许通过复制现有对象来生成新对象,而无需依赖具体类的构造函数
  • 在该模式中,一个原型对象作为基础,当需要创建新对象时,通过复制该原型对象并进行适当的修改来生成新的对象实例。

核心概念

  • 在原型设计模式中,核心概念是原型对象克隆方法
  • 原型对象是要被复制的对象,它必须实现一个克隆方法,该方法能够返回一个与自身相似的新对象。
  • 通过调用克隆方法,可以生成一个新的对象,并根据需要进一步的修改

关于拷贝

原型设计模式可以通过浅拷贝深拷贝来实现对象的复制。

  • 浅拷贝只复制对象的基本属性值,而对于引用类型的属性,则仍然是共享的。
  • 深拷贝则会递归地复制所有对象及其引用的对象,从而完全独立地创建一个新的对象。

示例

typescript 复制代码
// 定义原型对象接口
interface Prototype {
  // 原型对象必须实现一个clone方法,用来返回一个与自身相似的新对象
  // 注意clone方法的返回值的类型是Prototype
  clone(): Prototype;
}

// 具体的原型对象实现类
class ConcretePrototype implements Prototype {
  // 私有属性,复制之后的对象应该和元对象具有相同的私有属性
  private property: string;

  constructor(property: string) {
    this.property = property;
  }

  public clone(): Prototype {
    // 创建一个新的对象并复制当前对象的属性值
    const clonedObj = new ConcretePrototype(this.property);
    return clonedObj;
  }

  public getProperty(): string {
    return this.property;
  }
}

// 使用原型对象的客户端代码
const originalObj = new ConcretePrototype("Original Property");

// 克隆对象
const clonedObj = originalObj.clone();
// 克隆对象的应该和源对象具有相同的属性
console.log(originalObj.getProperty());  // 输出:Original Property
console.log(clonedObj.getProperty());    // 输出:Original Property

// 在克隆之后,可以对细节进行修改
originalObj.property = "Modified Property";
console.log(originalObj.getProperty());  // 输出:Modified Property
console.log(clonedObj.getProperty());    // 输出:Original Property

应用场景

  • 当一个对象的创建过程很昂贵或复杂 时,可以使用原型模式来避免重复执行这些过程。
  • 当需要创建多个相似对象时,可以使用原型模式来节省时间和资源
  • 当一个对象需要有多个可变状态组合时,可以使用原型模式来方便地生成不同状态的对象。
  1. 原型链 :JavaScript 中的每个对象都有一个原型(prototype)属性,它指向另一个对象。通过原型链,在查找对象的属性和方法时,可以逐级向上访问原型对象,实现属性和方法的继承关系。
  2. Object.create() 方法 :该方法可以用于创建一个新对象,并将一个现有对象设置为新对象的原型。这样,新对象就可以继承原型对象的属性和方法。
  3. DOM 操作 :在浏览器环境中,通过 DOM 操作创建、复制或修改元素是常见的使用原型模式的例子。例如,可以使用 cloneNode() 方法来克隆一个 DOM 元素节点,从而生成具有相同属性和子节点的新元素。
相关推荐
用户47949283569159 分钟前
JavaScript 今天30 岁了,但连自己的名字都不属于自己
javascript
用户479492835691524 分钟前
Vite8来啦,告别 esbuild + Rollup,Vite 8 统一用 Rolldown 了
前端·javascript·vite
枫,为落叶27 分钟前
VueRouter前端路由
前端
踢球的打工仔27 分钟前
前端知识介绍
前端
草字1 小时前
uniapp 悬浮按钮支持可拖拽。可移动。
前端·javascript·uni-app
一位搞嵌入式的 genius1 小时前
Vue实例挂载:从原理到项目实践的全维度解析
前端·javascript·vue.js·前端框架
waeng_luo1 小时前
[鸿蒙2025领航者闯关] 表单验证与用户输入处理最佳实践
开发语言·前端·鸿蒙·鸿蒙2025领航者闯关·鸿蒙6实战·开发者年度总结
0思必得01 小时前
[Web自动化] 开发者工具应用(Application)面板
运维·前端·python·自动化·web自动化·开发者工具
m0_740043731 小时前
Vue Router中获取路由参数d两种方式:$route.query和$route.params
前端·javascript·vue.js
风止何安啊1 小时前
Event Loop 教你高效 “划水”:JS 单线程的“摸鱼”指南
前端·javascript·面试