JavaScript装饰器模式核心是用高阶函数封装原函数以增强行为,支持函数和类方法装饰,可用于日志、节流、权限控制等场景,需注意this绑定、参数透传及语法兼容性。
JavaScript 中实现装饰器模式的核心思路是:用一个函数包裹另一个函数,在不改动原函数代码的前提下,增强或修改其行为。这本质上是函数式编程中的“高阶函数”思想,ES2019+ 也正式支持类和方法的 @decorator 语法(需编译器支持),但底层逻辑仍基于函数封装。
这是最基础、兼容性最好的方式。装饰器本身是一个接收函数作为参数、并返回新函数的函数。
this 绑定和参数透传,常用 ...args 和 call/apply
例如,实现一个简单的日志装饰器:
function logDecorator(fn) {使用时:
const add = (a, b) => a + b;
const loggedAdd = logDecorator(add);
loggedAdd(2, 3); // 控制台输出调用与返回信息
多个装饰器可依次嵌套,形成“装饰链”。为提升可读性和复用性,可封装
compose 或 pipe 工具函数。
compose(f, g) 表示先执行 g,再将结果传给 f(右到左执行)pipe(左到右),语义更直观:比如 pipe(throttle(300), logDecorator, catchError)
简易 pipe 实现:
在类中使用 @ 语法修饰方法时,装饰器函数接收三个参数:target(原型或构造函数)、propertyKey(方法名)、descriptor(属性描述符)。可通过修改 descriptor.value 来包装方法。
注意:该语法目前处于 Stage 3 提案,需开启 Babel 插件(如 @babel/plugin-proposal-decorators)或使用 TypeScript,并启用 experimentalDecorators 选项。
name 和 length,必要时可用 Object.defineProperty 手动修复prototype),且无法正确绑定 this