原型设计模式在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 元素节点,从而生成具有相同属性和子节点的新元素。
相关推荐
普通人61 天前
Web端3D模型加载实战指南_Vue3_uni-app_HTML
前端·javascript·uni-app·html
志尊宝1 天前
AI原生前端开发(043):AI辅助的样式生成(Tailwind CSS)
前端·css·ai-native
志尊宝1 天前
AI原生前端开发(042):AI辅助的路由设计与优化
javascript·react.js·ai-native
king王一帅1 天前
QuireKit 编辑器的 AI-Native 是如何设计的?谈谈我对真正 AI-Native 的理解
前端·开源·agent
是2的10次方啊1 天前
设计模式与生活⑩:地铁没变,你换了个状态
设计模式
风骏时光牛马1 天前
生成一个AI开源工具体验标题,只需要一个标题,不需要其他的任何文本。
前端
软件派1 天前
生产动态数据智能风控:阈值判别、趋势预测、异常识别算法工程落地实战
前端·数据库·算法
花开盛夏^.^1 天前
电脑打开多个浏览器Web窗口占用较大的运行内存的原因
前端·浏览器
Dxy12393102161 天前
JS DES 加密详解
开发语言·javascript·arcgis
充值内卷1 天前
我给桌面加了个鱼缸:C++ 写后端,WebView2 里养一座 Three.js 小岛
开发语言·javascript·c++