一文理解JavaScript装饰器模式

作者:代码拾荒时间:2026-10-25 09:36:36浏览:336

本文深入解析JavaScript中的装饰器模式,介绍其作为结构型设计模式的核心概念。通过对比常规函数包装与ES7装饰器语法,展示如何在不改变类结构的前提下动态扩展功能。文章涵盖方法装饰器与属性装饰器的代码示例,并剖析其基于对象描述符的实现原理,帮助开发者掌握这一现代JS特性。

装饰器模式概述

装饰器模式是一种常见的设计思路,旨在不修改现有对象结构的前提下,为其添加新功能。作为一种结构型模式,它通过包装现有类来实现功能的增强。

该模式的核心在于创建一个装饰类,用于包裹原始类。在确保原有类方法签名保持完整的同时,装饰类能够提供额外的行为或功能。

JavaScript 中的装饰器语法

在 JavaScript 中,装饰器(Decorator)是 ES7 阶段引入的一种新语法特性。它允许开发者对​类、方法、属性​进行​修饰​,从而实现特定功能的定制。虽然其语法形式与 Java 中的注解(Annotation)相似,但两者的具体功能实现存在显著差异。

代码示例:

不使用装饰器:

装饰器代码示例

const log = (srcFun) => {
if(typeof(srcFun) !== 'function') {
throw new Error(`the param must be a function`);
}
return (...arguments) => {
console.info(`${srcFun.name} invoke with ${arguments.join(',')}`);
srcFun(...arguments);
}
}
const plus = (a, b) => a + b;
const logPlus = log(plus);
logPlus(1,2);
// plus invoke with 1,2

使用装饰器:

const log = (target, name, descriptor) => {
var oldValue = descriptor.value;
descriptor.value = function() {
console.log(`Calling ${name} with`, arguments);
return oldValue.apply(this, arguments);
};
return descriptor;
}
class Math {
@log // Decorator
plus(a, b) {
return a + b;
}
}
const math = new Math();
math.plus(1, 2);
// Calling plus with 1,2

对比上述代码可以发现,当开发者仅需调用函数而无需关注其内部实现逻辑时,使用装饰器能显著提升代码的可读性,且使用体验更加便捷。

// readonly 装饰器
import { readonly } from 'core-decorators';
class Fudao {
@readonly
title = 'A';
}
var fudao = new Fudao();
fudao.title = 'B'; // This will log error & doesn't work

装饰器实现原理

JavaScript 中的装饰器本质上是一个函数,其工作原理依赖于 JS 中object的descriptor机制。

模式优势与特点

采用装饰器模式时,装饰类与被装饰类可以独立演进,二者之间不存在紧密耦合。此外,装饰模式可视为继承的一种替代方案,它能够动态地扩展实现类的功能。

至此,关于 JavaScript 装饰器模式的介绍已完成。如需了解更多相关 JS 装饰器模式内容,建议查阅本站往期文章或继续阅读后续相关内容,感谢大家的支持!

作者最新文章