js装饰器模式

ops/2025/1/12 7:49:56/

装饰器模式是一种结构型设计模式,它允许你在不改变对象结构的情况下,动态地给对象添加新的行为或职责。
装饰器模式通过创建一个装饰器类,来包装原始对象,并在不改变原始对象的基础上,为其添加新的功能。装饰器类和原始对象实现相同的接口,因此可以互相替换
优点是可以在不改变原始对象的情况下,动态地添加新的功能,从而提高代码的灵活性和可维护性。
同时,装饰器模式也可以避免在原始对象中添加过多的功能,从而提高代码的可读性和可维护性。
缺点是会增加代码的复杂性,并且可能会影响代码的性能。因此,在使用装饰器模式时,需要谨慎考虑,并根据具体情况选择合适的设计模式。

在这里插入图片描述

运用

设我们的初始需求是:每个业务中的按钮在点击后都弹出「您还未登录哦」的弹窗。
产品经理说这个弹窗提示还不够明显,我们应该在弹窗弹出后把按钮的文案改为“快去登录”,同时把按钮置灰。

  <body><div class="box"><button id="open">打开弹窗</button><button id="close">关闭弹窗</button></div><script>//源代码const open = document.getElementById('open')const close = document.getElementById('close')const box = document.querySelector('.box')const Modal = (function () {let instance = nullreturn () => {if (!instance) {instance = document.createElement('div')instance.innerHTML = '内容'instance.className = 'modal'instance.style.display = 'none'box.appendChild(instance)}return instance}})()function openModal() {const modal = Modal()modal.style.display = "block"}class OpenBtn {onClick() {const modal = Modal()modal.style.display = "block"}}class Decorator {constructor(openBtn) {this.openBtn = openBtn}onClick() {//旧逻辑this.openBtn.onClick()//新逻辑this.changeBtn()}changeBtn() {open.innerText = '快去登录'open.setAttribute('disabled', true)}}const openBtn = new OpenBtn()const decorator = new Decorator(openBtn)open.addEventListener('click', () => {decorator.onClick()})</script></body>

装饰器语法糖

// 装饰器函数,它的第一个参数是目标类
function classDecorator(target) {target.hasDecorator = truereturn target
}// 将装饰器“安装”到Button类上
@classDecorator
class Button {// Button类的相关逻辑
}// 验证装饰器是否生效
console.log('Button 是否被装饰了:', Button.hasDecorator)

http://www.ppmy.cn/ops/149383.html

相关文章

Win11 上使用 Qume 搭建银河麒麟V10 arm版虚拟机

安装全程需要下载3个文件&#xff0c;可在提前根据文章1.1、2.1、2.2网址下载。 1 QEMU软件简介与安装流程 QEMU&#xff08;Quick Emulator&#xff09;是一个开源软件&#xff0c;可以模拟不同的计算机硬件行为&#xff08;如模拟arm架构&#xff09;&#xff0c;并可以创建…

Ceph分布式存储集群,不仅仅是一个简单的对象存储解决方案

Ceph 作为 OpenStack 的存储后端 块存储&#xff08;Cinder 后端&#xff09; Ceph 的 RBD&#xff08;RADOS Block Device&#xff09;模块作为 OpenStack Cinder 服务的后端&#xff0c;为虚拟机提供块级别的存储资源。RBD 支持快照、克隆和恢复等功能&#xff0c;能够满足虚…

Elasticsearch—索引库操作(增删查改)

Elasticsearch中Index就相当于MySQL中的数据库表 Mapping映射就类似表的结构。 因此我们想要向Elasticsearch中存储数据,必须先创建Index和Mapping 1. Mapping映射属性 Mapping是对索引库中文档的约束&#xff0c;常见的Mapping属性包括&#xff1a; type&#xff1a;字段数据类…

解决VMWare虚拟机“无法获取vmci驱动程序版本”的问题

打开虚拟机却提示“无法获得vmci驱动程序的版本&#xff1a;句柄无效”&#xff0c;导致虚拟机无法启动。 下面为大家详细介绍一下打开虚拟机提示“无法获得vmci驱动程序的版本&#xff1a;句柄无效”的解决方法。 找到虚拟机的存放路径&#xff0c;打开该路径&#xff0c;找到…

苹果手机(IOS系统)出现安全延迟进行中如何关闭?

苹果手机&#xff08;IOS系统&#xff09;出现安全延迟进行中如何关闭&#xff1f; 一、设置二、隐私与安全性三、失窃设备保护关闭 一、设置 二、隐私与安全性 三、失窃设备保护关闭

怎麼在iPhone iOS(Wi-Fi/蜂窩數據)上查找IP地址?

在排除網路故障和設置代理時&#xff0c;都需要查找iPhone的IP地址。本教程將介紹查找IP地址的步驟&#xff0c;包括連接到Wi-Fi和使用蜂窩數據。 IP地址是設備連接到網路時分配的唯一編號&#xff0c;允許iPhone與其他線上設備通信。 公共 IP 地址&#xff1a;由ISP分配並用…

LeetCode LCR 083. 全排列

这个问题要求我们给定一个不含重复数字的整数数组 nums&#xff0c;返回其所有可能的全排列。全排列是数学中的一个概念&#xff0c;指的是从给定的数字集合中&#xff0c;按照一定的顺序&#xff0c;生成所有可能的排列组合。 问题描述 解题思路 解决这个问题的关键在于理解…

PHP 循环控制结构深度剖析:从基础到实战应用

PHP 循环控制结构深度剖析&#xff1a;从基础到实战应用 PHP提供了多种控制结构&#xff0c;其中循环控制结构是最常见的结构之一。它们使得我们能够高效地重复执行一段代码&#xff0c;直到满足某个条件为止。本文将从PHP循环的基础知识出发&#xff0c;逐步分析其在实际项目…