首页 > web前端 > js教程 > 正文

JavaScript装饰器模式_类与方法的装饰实践

幻影之瞳
发布: 2025-11-25 16:08:02
原创
346人浏览过
装饰器模式通过元编程动态扩展对象功能,如在JavaScript中使用类装饰器记录类创建、方法装饰器添加日志,实现权限校验、性能监控等横切关注点,无需修改原有代码。

javascript装饰器模式_类与方法的装饰实践

装饰器模式是一种在不修改原有代码的前提下,动态扩展对象功能的设计模式。在 JavaScript 中,借助 ES6 的类和 TypeScript 提供的装饰器语法(目前处于提案阶段,但广泛用于框架如 Angular),我们可以非常直观地实现类与方法的装饰。这种模式特别适用于日志记录、权限校验、性能监控等横切关注点。

类装饰器:增强整个类的行为

类装饰器接收构造函数作为唯一参数,可以用来监听、修改或替换类的定义。

例如,我们想为某个类标记其是否已启用,可以通过类装饰器实现:

function logClass(target: Function) {
  console.log('类已创建:', target.name);
}

@logClass
class Person {
  constructor(public name: string) {}
  greet() {
    return `Hello, I'm ${this.name}`;
  }
}

当定义 Person 类时,装饰器会立即执行,输出“类已创建: Person”。这适合做注册、元数据注入或行为拦截。

立即学习Java免费学习笔记(深入)”;

方法装饰器:控制单个方法的调用逻辑

方法装饰器应用于类的方法,它接收三个参数:目标对象、方法名、属性描述符。通过修改描述符,可以改变方法的行为。

Levity
Levity

AI帮你自动化日常任务

Levity 206
查看详情 Levity

常见的使用场景包括防抖、日志追踪、权限检查等。

function readonly(target: any, key: string, descriptor: PropertyDescriptor) {
  descriptor.writable = false;
}

function log(target: any, key: string, descriptor: PropertyDescriptor) {
  const original = descriptor.value;
  descriptor.value = function (...args: any[]) {
    console.log(`调用方法: ${key}`, '参数:', args);
    return original.apply(this, args);
  };
}

class Calculator {
  @log
  add(a: number, b: number) {
    return a + b;
  }
}

上述代码中,@log 装饰器包裹了 add 方法,在调用前后打印日志,而不会影响原有逻辑。这种方式解耦了业务代码与辅助功能。

实际应用场景建议

装饰器非常适合处理重复性的横切逻辑。以下是几个实用方向:

  • 性能监控:用装饰器记录方法执行时间,帮助定位慢操作
  • 权限验证:在关键方法前检查用户角色或登录状态
  • 缓存机制:对耗时计算的方法结果进行缓存,提高响应速度
  • 参数校验:自动验证输入合法性,减少样板代码

注意:原生 JavaScript 尚未正式支持装饰器,需通过 Babel 或 TypeScript 编译转换。使用时应确保构建工具配置正确。

基本上就这些。掌握装饰器模式后,你会发现很多原本需要侵入式修改的地方,现在都能优雅解决。关键是理解它如何通过元编程改变行为,而不是直接改动实现。

以上就是JavaScript装饰器模式_类与方法的装饰实践的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号