日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

JavaScript装饰器模式

發(fā)布時間:2025/4/16 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaScript装饰器模式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

裝飾器模式

適配器模式是原來的接口就不能用了,需要做一個適配之后才能繼續(xù)使用。
裝飾器是原先接口還能用,在此基礎(chǔ)上添加一些新功能。(為對象添加新功能,并且不改變原有結(jié)構(gòu)和功能)

下面我們來舉一個裝飾器的例子:

class Circle {draw() {console.log('畫一個圓形')} }class Decorator {constructor(circle) {this.circle = circle}draw() {this.circle.draw()this.setRedBorder(circle)}setRedBorder(circle) {console.log('設(shè)置紅色邊框')} }// 測試 let circle = new Circle() circle.draw()let dec = new Decorator(circle) dec.draw()

可以看到,通過裝飾器方式獲取到的dec,既可以畫一個圓,又可以設(shè)置紅色邊框。通過上述代碼,其實我們也可以感受到Decorator就像是給Circle加了一層外包裝。所以有的時候我們將裝飾器也稱之為包裝器(wrapper)

我們剛才看到上面的代碼樣式,其實理解起來不算特別友好。在Spring Boot中,可以通過@的方式來添加裝飾器,但目前JavaScript還不支持,不過Typescript中,已經(jīng)可以作為一個實驗性的功能加以支持。不過在JavaScript中,還可以通過安裝一些npm包的方式加以支持。下面我們來看看如何寫出更容易理解的裝飾器代碼。


使用裝飾器

我們首先來看一個簡單的例子:

@testDec class Demo {// ... }function testDec(target) {target.isDec = true } alert(Demo.isDec) // true

他的原理等同于

@decorator class A {} // 等同于 class A {} A = decorator(A) || A

可以看到它其實有點類似于一種包裝的形式。

加參數(shù)的裝飾器
function testDec(isDec) {return function (target) {target.isDec = isDec} }@testDec(false) class Demo {} alert(Demo.isDec) // false
混合形式Mixins裝飾器

除了簡單的參數(shù)之外,還可以使用混合形式。

function mixins(...list) {return function (target) {// 將所有可枚舉屬性的值從一個或多個源對象復(fù)制到目標(biāo)對象。它將返回目標(biāo)對象Object.assign(target.prototype, ...list)} }const Foo = {foo() {alert('foo')} }@mixins(Foo) class MyClass {} let obj = new MyClass() obj.foo() // foo
裝飾方法

實現(xiàn)只讀功能:

function readonly(target, name, descriptor) {// descriptor屬性描述對象 (Object.defineProperty中會用到), 原來的值如下:/* value: specifiedFunction,enumerate: false,configurable: true,writable: true */descriptor.writable = falsereturn descriptor }class Person {constructor() {this.first = 'A'this.last = 'B'}@readonlyname() {return `${this.first} ${this.last}`} }let p = new Person() console.log(p.name) // false p.name = function() {alert(100) }

實現(xiàn)打印日志,然后再執(zhí)行函數(shù)的值:

function log(target, name, descriptor) {let oldValue = descriptor.value descriptor.value = function () {console.log(`calling ${name} with`, arguments)// oldValue是一個函數(shù),此處是做加法的執(zhí)行return oldValue.apply(this, arguments)}return descriptor }class Math {@logadd(a, b) {return a + b} }let math = new Math() const result = math.add(2, 4) console.log(result) // calling add with Arguments(一個對象) 6 《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的JavaScript装饰器模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。