前端設計模式——裝飾者模式

来源:https://www.cnblogs.com/ronaldo9ph/archive/2023/03/10/17202379.html
-Advertisement-
Play Games

裝飾者模式(Decorator Pattern)是一種結構型設計模式,它允許你在不改變對象自身的基礎上,動態地給一個對象添加額外的功能。在前端中,裝飾者模式經常被用於擴展或修改組件的行為或樣式。 JavaScript 中的裝飾者模式可以通過以下幾種方式實現: 1. 通過擴展對象的屬性或方法來實現裝飾 ...


裝飾者模式(Decorator Pattern)是一種結構型設計模式,它允許你在不改變對象自身的基礎上,動態地給一個對象添加額外的功能。在前端中,裝飾者模式經常被用於擴展或修改組件的行為或樣式。

 

JavaScript 中的裝飾者模式可以通過以下幾種方式實現:

1. 通過擴展對象的屬性或方法來實現裝飾者模式

const obj = {
  foo() {
    console.log('foo');
  }
}

// 定義一個裝飾函數,用於擴展原始對象的方法
function barDecorator(obj) {
  obj.bar = function() {
    console.log('bar');
  }
  return obj;
}

// 使用裝飾函數來擴展原始對象
const decoratedObj = barDecorator(obj);
decoratedObj.foo(); // 輸出 "foo"
decoratedObj.bar(); // 輸出 "bar"

 

在上面的示例中,我們首先定義了一個原始對象 `obj`,它包含一個方法 `foo`。然後,我們定義了一個裝飾函數 `barDecorator`,它接收一個對象作為參數,用於為這個對象添加一個新的方法 `bar`。最後,我們使用 `barDecorator` 函數來擴展原始對象 `obj`,並得到了一個新的對象 `decoratedObj`,它包含了原始對象的方法 `foo` 和新的方法 `bar`。

 

2. 通過擴展對象的原型來實現裝飾者模式

// 定義一個原始對象
function Foo() {}

// 在原型上定義一個方法
Foo.prototype.foo = function() {
  console.log('foo');
}

// 定義一個裝飾函數,用於擴展原型的方法
function barDecorator(clazz) {
  clazz.prototype.bar = function() {
    console.log('bar');
  }
}

// 使用裝飾函數來擴展原型
barDecorator(Foo);

// 創建一個新的對象,並使用擴展後的方法
const obj = new Foo();
obj.foo(); // 輸出 "foo"
obj.bar(); // 輸出 "bar"

 

在上面的示例中,我們首先定義了一個原始對象 `Foo`,它是一個構造函數,用於創建一個對象。然後,我們在原型上定義了一個方法 `foo`。接著,我們定義了一個裝飾函數 `barDecorator`,它接收一個構造函數作為參數,用於在原型上添加一個新的方法 `bar`。最後,我們使用 `barDecorator` 函數來擴展原始對象的原型,然後創建一個新的對象 `obj`,並使用擴展後的方法 `foo` 和 `bar`。


需要註意的是,裝飾者模式可以嵌套使用,也就是說,我們可以通過多個裝飾函數來依次為一個組件添加多個不同的功能。同時,裝飾者模式也可以用於對已有的組件進行擴展,使得我們可以在不改變原有代碼的情況下,給組件添加新的行為和樣式。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. 前言 kafka作為數據中間鍵在數據服務解耦,大數據,日誌方面堪稱一把瑞士軍刀,備受青睞,作為提供了一套完整命令行的程式,日常進行調試過程中難免會用到一些指令,現總結18條最常用指令。 2. 常用指令 啟動消費者 bin/kafka-console-consumer.sh --bootstra ...
  • 上架基本需求資料 1、蘋果開發者賬號 註冊好的蘋果開發者賬號,個人的就可以了。繳納年費99美刀後登錄到蘋果開發者後臺即刻看到如下內容 簡單描述一下以上內容用於幹啥: 1.app Store Connect:用於蘋果上架,也就是咱們上架到app Store所需要操作的目錄 2.證書、標識符和描述文件: ...
  • 前言 寫作如說話,想說與說明白中間隔著溝壑! 下麵用 Notion AI 作詩來作為本文開頭吧。 想說與說明白(作者:Notion AI) 想說千言萬語,說明白卻難如登天。 言語之間,溝壑重重,思想與表達,有時天壤之別。 有時候,我們沉默不語, 缺乏表達能力,難以抒發內心的情感。 這時候,Notio ...
  • ​ 表格: <table> <tr> <th>表格1</th> </tr> <tr> <td>表格2</td> </tr> </table> 快捷鍵:table>tr*數量>td*數量 屬性名 屬性值 說明 align left、center、right border 1或“” 邊框 cellpad ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 vue3 於 2020 年 09 月 18 日正式發佈,2022 年 2 月 7 日 vue3 成為新的預設版本 距離 vue3 正式發佈已經過去兩年有餘, 成為預設版本也過去大半年了,以前還能說是對新技術、新特性的觀望,而現在面試都直問 ...
  • Web開發工具 從高層次來看,可以將客戶端工具放入以下三大類需要解決的問題中: 安全網路 — 在代碼開發期間有用的工具。 轉換 — 以某種方式轉換代碼的工具,例如將一種中間語言轉換為瀏覽器可以理解的 JavaScript。 開發後階段 — 編寫完代碼後有用的工具,如測試和部署工具。 終端命令 導航計 ...
  • 大數據時代,各行各業對數據採集的需求日益增多,網路爬蟲的運用也更為廣泛,越來越多的人開始學習網路爬蟲這項技術,K哥爬蟲此前已經推出不少爬蟲進階、逆向相關文章,為實現從易到難全方位覆蓋,特設【0基礎學爬蟲】專欄,幫助小白快速入門爬蟲,本期為網頁基本結構介紹。 網頁概述 網頁是互聯網應用的一種形態,是組 ...
  • 前言: Antd + echarts 我想要實現的是點擊表的某一行自動生成對應的折線圖,我在點擊第一行生成5條線,我在點擊第二行的時候,本該生成2條線,結果還是5條線; 最開始我以為設置的 series 沒有初始化,後來打斷點查看數據是兩條,但是生成的線是五條,這個就很離譜 問題原因 官網是這麼說的 ...
一周排行
    -Advertisement-
    Play Games
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...