一文理解JavaScript装饰器模式
本文深入解析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 装饰器模式内容,建议查阅本站往期文章或继续阅读后续相关内容,感谢大家的支持!
JavaScript异步发送HTTP请求时怎么优雅地处理错误
2026-11-05 17:10:44
5款主流JS在线运行工具对比:CodePen、JSFiddle与StackBlitz怎么选
2026-11-05 17:04:04
JavaScript入门书籍避坑:这些书不适合初学者
2026-11-05 16:31:15
JS使用Math.round实现保留两位小数的原理与代码
2026-11-05 15:35:55
JavaScript 原生 Date 对象怎么实现日期加减
2026-11-05 14:30:00
