原型设计模式在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 元素节点,从而生成具有相同属性和子节点的新元素。
相关推荐
丶白泽8 分钟前
重修设计模式-结构型-组合模式
设计模式·组合模式
天下无贼!1 小时前
2024年最新版Vue3学习笔记
前端·vue.js·笔记·学习·vue
Jiaberrr1 小时前
JS实现树形结构数据中特定节点及其子节点显示属性设置的技巧(可用于树形节点过滤筛选)
前端·javascript·tree·树形·过滤筛选
赵啸林1 小时前
npm发布插件超级简单版
前端·npm·node.js
yunhuibin1 小时前
ffmpeg面向对象——参数配置秘密探索及其设计模式
学习·设计模式·ffmpeg
我码玄黄1 小时前
THREE.js:网页上的3D世界构建者
开发语言·javascript·3d
罔闻_spider1 小时前
爬虫----webpack
前端·爬虫·webpack
吱吱鼠叔1 小时前
MATLAB数据文件读写:1.格式化读写文件
前端·数据库·matlab
爱喝水的小鼠2 小时前
Vue3(一) Vite创建Vue3工程,选项式API与组合式API;setup的使用;Vue中的响应式ref,reactive
前端·javascript·vue.js
小晗同学2 小时前
Vue 实现高级穿梭框 Transfer 封装
javascript·vue.js·elementui